Redis 如果另一个键中的计数器低于零,则自动从集合中删除项目?

Redis 如果另一个键中的计数器低于零,则自动从集合中删除项目?,redis,Redis,Redis 2.0.3 在我的Redis DB中,我有一组项。每个项目都有一个与之关联的计数器: MULTI SADD "items-set" "foo" INCRBY "items:foo" 10000 EXEC 新项目以随机间隔添加到集合中 当用户执行某个操作时,计数器将递减: new_counter = DECR "items:foo" 当计数器降到零以下时,我需要从集合中自动删除该项(或者:当计数器精确地达到零时,我可以为其设置逻辑) 如果新计数器

Redis 2.0.3

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

MULTI
    SADD "items-set" "foo"
    INCRBY "items:foo" 10000
EXEC
新项目以随机间隔添加到集合中

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

new_counter = DECR "items:foo"
当计数器降到零以下时,我需要从集合中自动删除该项(或者:当计数器精确地达到零时,我可以为其设置逻辑)

如果新计数器<0,则
多种
SREM“项目集”“foo”
删除“项目:foo”
执行官
结束
如何在不使用
SETNX
/
GETSET
锁定项目名称的情况下执行此操作


包括改变我在Redis中存储数据的方式的解决方案是可以接受的。(但是,为了以防万一,我保留权利用一些我可能在初始文本中遗漏的特定于任务的细节来反驳它们。)

只要使用Redis 2.2的新手表功能即可:

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
要理解这个例子,你需要理解手表是如何工作的。请在现场查看文件


< P>这是不可能的,它应该在一个循环中,所以如果其他人在中间触摸了值,你可以重试。
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

啊,我希望我的客户端库(恒星库)支持2.2。。。也许是时候切换到另一个了。这需要每个客户机为每个需要有条件地触发额外命令的操作发出WATCH和MULTI/EXEC。最不常见的情况会导致最常见情况的开销。在Redis 2.6中使用Lua脚本时,是否可以考虑注册一个持久性监视,其中将执行一个脚本或脚本块以响应事件?基本上,允许将任意回调函数注册为一个键或一组键的事件侦听器。这能有效吗?
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