Redis,如何使用ZINCRBY提高zset的所有分数?

Redis,如何使用ZINCRBY提高zset的所有分数?,redis,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“*”不是这样工作的。没有相应的命令,ZINCRBY一次只能增加一个成员。因此,如果您想以原子和快速的方式实现这一点,您需要执行Lu

有没有办法用一个命令增加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“*”
不是这样工作的。

没有相应的命令,ZINCRBY一次只能增加一个成员。因此,如果您想以原子和快速的方式实现这一点,您需要执行Lua脚本。应该是这样的(首先获得排序集的所有成员,然后遍历它们并增加分数):


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

没有用于此的命令,ZINCRBY一次只能增加一个成员。因此,如果您想以原子和快速的方式实现这一点,您需要执行Lua脚本。应该是这样的(首先获得排序集的所有成员,然后遍历它们并增加分数):


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

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

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

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