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中存储数据的方式的解决方案是可以接受的。 (但是,为了以防万一,我保留了一些权利,可以通过一些特定于任务的细节来对付它们,我可以在初始文本中将其遗漏。)
答案 0 :(得分:10)
只需使用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网站上的文档。
P.S。使用Redis 2.0.3
无法做到这一点答案 1 :(得分:2)
它应该在循环中,所以如果其他人触及中间的值,你可以重试。
success = false
while not success
WATCH items-set items:foo
count = GET items:foo
MULTI
IF count == 0:
SREM items-set foo
SET items:foo count-1
success = EXEC