减少Redis中的分数,如果为0,则删除

减少Redis中的分数,如果为0,则删除,redis,Redis,在排序集中,如何将一个Redis元素的分数减少1,或者在其值为0时将其删除?目前我使用的是$redis.zincrby user\u cart,-1,params[:product\u id](Rails 4.1.4),但我得到的是负值 提前谢谢 的回复是新的分数,因此您可以检查它,如果它是

在排序集中,如何将一个Redis元素的分数减少1,或者在其值为0时将其删除?目前我使用的是
$redis.zincrby user\u cart,-1,params[:product\u id]
(Rails 4.1.4),但我得到的是负值


提前谢谢

的回复是新的分数,因此您可以检查它,如果它是<1,则发出警告。

您可以编写一个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)

您询问了排序集,但这个问题还涉及INCR/DECR键。下面是一个使用Lua脚本和PHP Predis的示例:


$lua=Nice。删除元素时为什么不返回“0”而不是“-1”?@EduardOparejatobe没有理由。0也是一个很好的答案。但是,要将逻辑更改为允许0,并且以后只删除否定项,这将更加困难。如果您在客户端使用管道,并且想要像这样的特定行为,则此答案比接受的答案更有意义。
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)