7

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

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

我想通过 redis 命令对所有键的所有值求和,请帮我解决它。太感谢了。

4

3 回答 3

16

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 实例中有很多键,性能就会很差,并且在扫描键时实例将被阻止所有连接。

于 2013-10-29T10:31:31.073 回答
5

从 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

于 2018-06-20T12:26:42.613 回答
0

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

于 2014-02-25T14:03:37.100 回答