redis - redis 可以禁用流水线命令的回复吗?

标签 redis pipeline reply

我目前正在开发一个缓存,需要为每次这样的调用增加几百个计数器:

redis.pipelined do
  keys.each{ |key| redis.incr key }
end

在我现在的分析中,我看到我不需要的回复仍然被 redis gem 收集,浪费了一些宝贵的时间。我可以通过某种方式告诉 Redis 我对回复不感兴趣吗?有没有更好的方法来增加很多值。

我没有找到 MINCR 命令,例如..

提前致谢!

最佳答案

是的……至少在 2.6 中。您可以在 LUA 脚本中执行此操作,只需让 LUA 脚本返回一个空结果即可。这里使用的是 booksleeve 客户端:

const int DB = 0; // any database number
// prime some initial values
conn.Keys.Remove(DB, new[] {"a", "b", "c"});
conn.Strings.Increment(DB, "b");
conn.Strings.Increment(DB, "c");
conn.Strings.Increment(DB, "c");

// run the script, passing "a", "b", "c", "c" to
// increment a & b by 1, c twice
var result = conn.Scripting.Eval(DB,
    @"for i,key in ipairs(KEYS) do redis.call('incr', key) end",
    new[] { "a", "b", "c", "c"}, // <== aka "KEYS" in the script
    null); // <== aka "ARGV" in the script

// check the incremented values
var a = conn.Strings.GetInt64(DB, "a");
var b = conn.Strings.GetInt64(DB, "b");
var c = conn.Strings.GetInt64(DB, "c");

Assert.IsNull(conn.Wait(result), "result");
Assert.AreEqual(1, conn.Wait(a), "a");
Assert.AreEqual(2, conn.Wait(b), "b");
Assert.AreEqual(4, conn.Wait(c), "c");

或者用 incrby 做同样的事情,将“by”数字作为参数传递,将中间部分更改为:

// run the script, passing "a", "b", "c" and 1, 1, 2
// increment a & b by 1, c twice
var result = conn.Scripting.Eval(DB,
    @"for i,key in ipairs(KEYS) do redis.call('incrby', key, ARGV[i]) end",
    new[] { "a", "b", "c" }, // <== aka "KEYS" in the script
    new object[] { 1, 1, 2 }); // <== aka "ARGV" in the script

关于redis - redis 可以禁用流水线命令的回复吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13025165/

相关文章:

python - 如何在 scikit-learn 中使用管道调整自定义内核函数的参数

python - 使用 python 3.4 回复电子邮件

facebook - Microsoft bot 框架发布机器人

redis客户端列表重新运行 "cmd=NULL"

node.js - 如何为heroku redis Node 启用tls?

node.js - Redis 发布/订阅限制

Github action `on` 中没有定义事件触发器

database - 在集中设置中需要 redis 服务器

python - GridSearchCV 在管道中将 fit_params 传递给 XGBRegressor 产生 "ValueError: need more than 1 value to unpack"

iPhone Objective-C - wait_fences : failed to receive reply: 10004003