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

标签 redis

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/

相关文章:

sql-server - 单独使用 Firebase 还是使用 Firebase 和 Redis 进行性能调整和实时功能?

php - 用于 PHP session 的 Redis - 为什么 Web 服务器上有这么多 session ,而本地只有一个?

java - 无法从运行@myIpaddress :6379 的哨兵获取主地址

redis - 如何理解Redis的内存使用情况?

database - 电子邮件数据库架构

caching - 使用 zrange 按时间段查询 Redis 时间序列

node.js - kubernetes中redis和nodejs出错

redis - Jedis java.lang.Long 不能转换为 [B

ruby-on-rails - rake 请求 :workers command forks infinite processes

lua - redis lua 调试器——为什么我不能打印 ARGV