如何将Redis中所有Key的值相加

时间:2013-10-29 08:53:49

标签: string redis sum

在Redis DB中,我有许多String类型的键来节省应用程序的下载时间, 例如:

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

我想用redis命令加总所有键的所有值,请帮我解决。非常感谢你。

3 个答案:

答案 0 :(得分:14)

Redis不是为了做这种事而设计的。您可以通过RDBMS,MongoDB或类似ElasticSearch的方式获得更好的服务。

但是,如果你需要这样做(从shell启动):

$ redis-cli keys '20131028:*' | awk '{print "get "$1}' | redis-cli | awk '{x+=$1} END { print x }'

另一种方法是使用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实例中有许多密钥,性能将会很糟糕,并且在扫描密钥时将阻止所有连接的实例。

答案 1 :(得分:3)

由于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脚本会阻止一切,这在大多数情况下可能会破坏交易。来源:stackoverflow.com/a/30896608/2440

答案 2 :(得分:0)

我认为最好使用mget并使用一个命令获取所有键,而不是为每个键发出一个命令。这样你只需要一次调用redis即可得到所有结果,只需总结它们即可。当然,这只有在你事先知道钥匙的情况下才有效......