我正在开发一个缓存,需要为每个调用增加几百个计数器,如下所示:
redis.pipelined do
keys.each{ |key| redis.incr key }
end
在我的分析中,我看到我不需要的回复仍然被redis宝石收集并浪费了一些有价值的时间。我能以某种方式告诉redis我对回复不感兴趣吗?有没有更好的方法来增加很多值。
我没有找到MINCR
命令,例如..
提前致谢!
答案 0 :(得分:5)
是的......至少在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
答案 1 :(得分:2)
不,这是不可能的。没有办法告诉Redis不回复。
避免在某些时候同步等待回复的唯一方法是运行完全异步的客户端(如异步模式下的node.js或hiredis)。
答案 2 :(得分:1)
Redis 3.2版明确支持:
https://redis.io/commands/client-reply
CLIENT REPLY命令控制服务器是否回复客户端的命令。可以使用以下模式: 上。这是服务器向每个命令返回答复的默认模式。 关闭。在此模式下,服务器不会回复客户端命令。 跳跃。此模式会立即跳过命令的回复。
返回值 使用OFF或SKIP子命令调用时,不会进行任何回复。使用ON调用时: 简单的字符串回复:好的。