Redis 2.0.3
在我的 Redis 数据库中,我有一组项目。每个项目都有一个与之关联的计数器:
MULTI
SADD "items-set" "foo"
INCRBY "items:foo" 10000
EXEC
新项目以随机间隔添加到集合中。
当用户执行某个操作时,计数器递减:
new_counter = DECR "items:foo"
当计数器降到零以下时,我需要从集合中原子地删除该项目(或者:当计数器恰好达到零时,我可以为此修复逻辑。)
if new_counter < 0 then
MULTI
SREM "items-set" "foo"
DEL "items:foo"
EXEC
end
如何在不使用 SETNX
/GETSET
锁定项目名称的情况下执行此操作?
解决方案,包括改变我在 Redis 中存储数据的方式,是可以接受的。 (但是,为了以防万一,我保留用一些我可能会在初始文本中遗漏的特定于任务的细节来对抗它们的权利。)
最佳答案
只需使用 Redis 2.2 的新 WATCH 功能:
WATCH items-set items:foo
count = GET items:foo
IF count == 0:
MULTI
SREM items-set foo
SET items:foo count-1
EXEC
ELSE:
MULTI
SET items:foo count-1
EXEC
要理解示例,您需要了解 WATCH 的工作原理。请在 http://redis.io 查看文档网站。
附注Redis 2.0.3 无法做到这一点
关于redis - 如果另一个键中的计数器低于零,则以原子方式从集合中删除一个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5118807/