如何在Redis中计算所有密钥的总价值

daolsyd0  于 2023-01-08  发布在  Redis
关注(0)|答案(4)|浏览(112)

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

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

我想用redis命令计算所有键的值,请帮我解决这个问题。谢谢。

sr4lhrrt

sr4lhrrt1#

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

eanckbw9

eanckbw92#

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

62o28rlo

62o28rlo3#

我认为最好使用mget,用一个命令获取所有的键,而不是为每个键发出一个命令。这样你只需要一次调用redis就可以得到所有的结果,然后把它们加起来。当然,只有你事先知道键的话,这才有效...

im9ewurl

im9ewurl4#

使用redis lua:

eval "local s = 0 for _,v in ipairs(redis.call('hvals', KEYS[1])) do s = s + v end return s" 1 Key

可以使用script load保存脚本,然后使用evalsha对任何哈希键重用脚本。

相关问题