Redis中的减分,如果为0,则将其删除

Ker*_*ozu 3 redis

如何将排序集中的一个Redis元素的得分减1,或者如果其值为0,则将其删除?目前,我正在使用$redis.zincrby user_cart, -1, params[:product_id](Rails 4.1.4),但得到的是负值。

提前致谢!

Ita*_*ber 6

ZINCRBY的回复是新分数,因此您可以检查它并在小于1时发出ZREM


Ofi*_*zon 5

您可以编写一个 LUA 脚本在 Redis 服务器端执行此操作。你可以使用这个:

local ans = redis.call('ZINCRBY', KEYS[1], ARGV[1], ARGV[2])
if   tonumber(ans) < 1 then
    redis.call('ZREM', KEYS[1], ARGV[2]) 
end
return (tonumber(ans) < 1 and '-1' or ans)
Run Code Online (Sandbox Code Playgroud)

在任何删除时,它将返回,-1否则将返回新成员分数。

这是来自测试运行的 sinnpet:

evalsha 6e8a61a2367772383f535587ce75e92d4e047fcf 1 myzset 3 blah
"3"
zrank myzset blah
(integer) 0
evalsha 6e8a61a2367772383f535587ce75e92d4e047fcf 1 myzset -3 blah
"-1"
zrank myzset blah
(nil)
evalsha 6e8a61a2367772383f535587ce75e92d4e047fcf 1 myzset -3 blah
"-1"
zrank myzset blah
(nil)
Run Code Online (Sandbox Code Playgroud)