【问题标题】:Use Redis for a timeout queue or leaderboard将 Redis 用于超时队列或排行榜
【发布时间】:2013-05-16 01:16:25
【问题描述】:

我想基本上像这样使用 Redis,如果它(假设)接受 SQL:

SELECT id, data, processing_due FROM qtable WHERE processing_due < NOW()

其中processing_due 是某种整数时间戳。

这个想法是同时删除已完成的“作业”,例如:

DELETE from qtable WHERE id = $someid

我会在生产(“插入”)和消费(“选择,删除”)端使用哪些 Redis 命令?

我发现 Redis 可以用作队列,但我不希望答案严格按照插入的顺序,而是基于“现在”是否超过 processing_due

我想这和排行榜几乎是一样的问题?

(我试图深入了解 Redis 的工作原理,从文档中它看起来很简单,但我就是不明白。)

一个不错的解决方案是做ZADD qtable &lt;timestamp&gt; &lt;UUID&gt;,然后使用UUID作为键来存储(json)值吗?

【问题讨论】:

    标签: php python database redis queue


    【解决方案1】:

    您可以使用Sorted Set,其中分数是您的时间(您建议的整数),然后您使用ZRANGEBYSCORE 进行查询。每个成员都将是您的“字段”的 Json 表示。例如:{id:"1",data:"bla",processing_due:"3198382"}

    关于删除,只要找到要删除的相关成员,使用ZREM即可。将您的 Json 字符串作为参数传递,就可以了。

    一个可能更好的变体是将生成的 ID 保存为您的成员,并在单独的 String 类型的密钥中保存您的 ID 对以及您的数据的 Json 表示形式。请记住保持两个结构同步。

    【讨论】:

    • 啊哈,这是我发现的另一件令人困惑的事情。根据价值删除是否被认为是 REDIS 土地的良好做法? (不是通常在 SQL 中所做的关键。)编辑:谢谢!这正是我在编写原始问题时自己想到的。但感觉如此陌生,我无法相信这是正确的做法。您确认此“模式”对您有很大帮助,谢谢。
    • 你实际上是基于一个键删除的,但是你这里的“键”本质上是排序集的一个“成员”,不要与真正的redis“键”混淆,它是一个代表的字符串你的整个结构(无论是简单的字符串、集合、排序集、散列还是列表)
    • 啊,酷。对您的评论 +1,它可能在未来对其他人也有帮助。就我而言,JSON 文档很小,所以我不会使用双重结构和 id 方法。
    • 为了确认,我会使用 SADD qtable '{id:"1",data:"bla",processing_due:"3198382"}' then @987654326 @ 和最后一个 ZREM qtable '{id:"1",data:"bla",processing_due:"3198382"}' ?
    • 完全正确(对于您的两个 cmets,即您必须在 ZADD 中设置课程分数)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2020-07-29
    • 2014-02-12
    相关资源
    最近更新 更多