在Redis DB中,我有许多String类型的键来节省应用程序的下载时间, 例如:
Key value
20131028:1 100
20131028:2 15
20131028:3 10
..........
我想用redis命令加总所有键的所有值,请帮我解决。非常感谢你。
答案 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即可得到所有结果,只需总结它们即可。当然,这只有在你事先知道钥匙的情况下才有效......