如果另一个键中的计数器低于零,则以原子方式从集合中删除项目?

Ale*_*ysh 6 redis

Redis 2.0.3

在我的Redis DB中,我有一组项目.每个项目都有一个与之相关的计数器:

MULTI
    SADD "items-set" "foo"
    INCRBY "items:foo" 10000
EXEC
Run Code Online (Sandbox Code Playgroud)

新项目以随机间隔添加到集合中.

当用户执行某个操作时,计数器会递减:

new_counter = DECR "items:foo"
Run Code Online (Sandbox Code Playgroud)

当计数器降到零以下时,我需要从集合中原子地移除项目(或者:当计数器完全达到零时,我可以为此修复逻辑.)

if new_counter < 0 then
    MULTI
        SREM "items-set" "foo"
        DEL "items:foo"
    EXEC
end
Run Code Online (Sandbox Code Playgroud)

如何在没有项目名称用SETNX/ 锁定的情况下执行此操作GETSET

涉及改变我在Redis中存储数据的方式的解决方案是可以接受的.(但是,为了以防万一,我保留一个权利,可以用一些特定于任务的细节来对付它们,我可以在初始文本中将其遗漏.)

ant*_*rez 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
Run Code Online (Sandbox Code Playgroud)

要了解该示例,您需要了解WATCH的工作原理.请查看http://redis.io网站上的文档.

ps没有办法用Redis 2.0.3做到这一点