当前位置: 首页 > 面试题库 >

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

宋耀
2023-03-14
问题内容

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网站上检查文档。

ps Redis 2.0.3无法做到这一点



 类似资料:
  • 问题内容: 说我有这些二维数组A和B。 如何从B中删除A中的元素。(集合论中的补语:AB) 更准确地说,我想做这样的事情。 问题答案: 基于this solution对,这里是用更少的内存占用与NumPy基础的解决方案,并与大型阵列工作时,可能是有益的- 样品运行- 在大型阵列上的运行时测试- 具有基础解决方案的时间- 基于更少内存占用量的定时解决方案- 进一步提升性能 通过将每一行视为索引元组来

  • 本文向大家介绍C#中判断一个集合是否是另一个集合的子集的简单方法,包括了C#中判断一个集合是否是另一个集合的子集的简单方法的使用技巧和注意事项,需要的朋友参考一下 看到这个标题,我们首先想到的是循环遍历其中一个数组,判断数组中的每个元素是否都在另一个数组中出现了,以此来判断该数组是不是另一个数组的子集,但是这样做就太过复杂了,有没有简单一点的方法呢? 打个比方,有这样的两个集合: 现在需要判断sm

  • 我使用的是Vue.js和Firebase FiRecovery。现在我有两个集合和。在订单集合中,我已经存储了集合的每个文档的id。我现在必须从中获取相应用户的详细信息。我应该怎么做?这是我迄今为止所做的 我需要在userInfo中存储用户数据。提前谢谢

  • 问题内容: 我有2个数据框,一个命名为USERS,另一个命名为EXCLUDE。他们两个都有一个名为“电子邮件”的字段。 基本上,我要删除EXERSUDE中包含电子邮件的USERS中的每一行。 我该怎么做? 问题答案: 您可以将和条件一起使用,通过以下方式反转布尔值: 另一个解决方案:

  • 我正在从远程数据库读取一组行,从本地数据库读取一组类似的行,然后使用RemoveAll删除本地已经存在的远程行。。。 但这对我来说似乎不对。当我真正需要做的只是检查是否存在匹配项时,我认为我不应该计算事物。我尝试了和的各种用法,但得到了废话。我不能使用(如这里建议的),因为列表元素不是同一类型。 有更好的方法吗?

  • 问题内容: 我正在尝试找到一种从数字值中删除的快速方法,如下所示: 是否存在某种优化的方法? 问题答案: 绝招。 在内部,这等效于使用或进行浮点转换,但我发现它更简单。