Redis,如何用ZINCRBY增加zset的所有分数?

时间:2015-07-24 17:57:22

标签: redis

有没有办法用一个命令增加zset的所有分数?这就是我想做的事情:

ZADD myzset 1 "first"
ZADD myzset 2 "second"
ZINCRBY myzset 2 "*"
ZRANGE myzset 0 -1 WITHSCORES
1) "first"
2) "3"
3) "second"
4) "4"

但是,ZINCRBY myzset 2 "*"不能像那样工作。

2 个答案:

答案 0 :(得分:5)

没有命令,ZINCRBY一次只能增加1个成员。因此,如果您想以原子和快速的方式完成此任务,则需要执行Lua脚本。它应该看起来像这样(首先你得到排序集的所有成员,然后迭代它们并增加分数):

local zsetMembers = redis.call('zrange', KEYS[1], '0', '-1') 
for k,member in pairs(zsetMembers) do 
  redis.call('zincrby', KEYS[1], 1, member) 
end

您可以使用EVAL命令将此脚本推送到Redis。

答案 1 :(得分:0)

如果您需要经常执行此任务或者这是您的应用服务器的一部分代码,也许您可​​以使用管道来加速任务。如果您的zset大小为N,那么您的客户端和redis服务器之间将有N个RTT。如果你使用管道,只需要一个RTT,这将节省网络传输时间。有关此内容的更多信息,请参阅此document。算法与@Liviu Costea相同。