String 如何对Redis中所有键的值求和

String 如何对Redis中所有键的值求和,string,redis,sum,String,Redis,Sum,在Redis DB中,为了节省应用程序的加载时间,我有许多键入字符串类型, 例如: Key value 20131028:1 100 20131028:2 15 20131028:3 10 .......... 我想用redis命令对所有键的所有值求和,请帮我解决。非常感谢您。Redis不是为做这种事情而设计的。RDBMS、MongoDB或类似ElasticSearch的东西会更好地为您服务 不过,如果您需要这样做(从

在Redis DB中,为了节省应用程序的加载时间,我有许多键入字符串类型, 例如:

   Key            value
20131028:1         100
20131028:2         15
20131028:3         10
..........

我想用redis命令对所有键的所有值求和,请帮我解决。非常感谢您。

Redis不是为做这种事情而设计的。RDBMS、MongoDB或类似ElasticSearch的东西会更好地为您服务

不过,如果您需要这样做(从shell启动):

另一种方法是使用Lua服务器端脚本:

$ redis-cli eval "local keys = redis.call('keys',KEYS[1]) ; local sum=0 ; for _,k in ipairs(keys) do sum = sum + redis.call('get',k) end ; return sum" 1 '20131028:*'

在这两种情况下,如果Redis实例中有许多密钥,那么性能都会很差,并且在扫描密钥时,实例将被阻止所有连接。

我认为最好使用mget并用一个命令获取所有密钥,而不是对每个密钥发出一个命令。这样,您只需调用一次redis即可获得所有结果,并且只需对结果进行汇总。当然,这只有在您事先知道密钥的情况下才有效…

因为Redis v2.6是在Redis服务器上执行Lua脚本的最棒的功能

127.0.0.1:6379> EVAL "local sum = 0 local i=1 local a1 = redis.call('hvals','Key') while(a1[i]) do sum=sum+a1[i] i=i+1 end return sum" 0
一个重要的注意事项是,Redis服务器端lua脚本会阻止一切,在大多数情况下,这可能会破坏交易。资料来源:


为了防止有人偶然发现这个答案,另一个好的选择(如果可以的话)是在存储值时将值添加到单独的键中。然后,只需获取先前计算的值。
127.0.0.1:6379> EVAL "local sum = 0 local i=1 local a1 = redis.call('hvals','Key') while(a1[i]) do sum=sum+a1[i] i=i+1 end return sum" 0