有没有办法用一个命令增加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 "*"
不能像那样工作。
答案 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相同。