【问题标题】:Redis conditional retrieve and delete recordsRedis 条件检索和删除记录
【发布时间】:2016-03-11 19:31:01
【问题描述】:

我们使用mysql作为消息队列,现在我们想从mysql改为redis。

我们在redis中实现与mysql相同的逻辑面临一些困难。 在Mysql中流程如下:

  • 使用 load data infile 批量插入 mysql 数据库。
  • 在其他 php 脚本中,我们根据条件按优先级顺序选择记录,然后从数据库中删除这些记录并处理这些记录

我们如何在 redis 中实现相同的功能?

  • 在 redis 中,我们可以使用带有 lpush 之类键和 json_encoded 数据的管道插入批量数据

我们如何在某些条件下按优先级从redis key order中获取数据并从redis中删除这些记录?

我们在mysql中的表结构如下:

CREATE TABLE `message_queue` ( `sql_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `msgdata` text, `pid` tinyint(4) DEFAULT NULL, `receiver` varchar(20) DEFAULT NULL, `time` bigint(20) DEFAULT '0', `udhdata` varchar(100) DEFAULT NULL, PRIMARY KEY (`sql_id`), KEY `pid` (`pid`), KEY `time` (`time`) ) ENGINE=MyISAM

选择和删除查询

SELECT * FROM message_queue WHERE (time = 0 OR time <= UNIX_TIMESTAMP()) ORDER BY pid DESC, sql_id ASC limit 500; DELETE FROM message_queue WHERE sql_id in(ids_list)

【问题讨论】:

    标签: redis


    【解决方案1】:

    要满足大部分要求,您需要将数据分解为多个数据结构。

    插入:

    1. message_queue 表中的每条记录都应存储在哈希中 - sql_id 看起来是一个不错的候选键名。
    2. 保持有序集,例如message_by_time,其中每个成员为sql_id,得分为time

    查询:

    1. 使用ZRANGEBYSCORE message_by_time 0 0ZRANGEBYSCORE message_by_time -inf &lt;replace-with-timestamp&gt; 获取初始范围。

    删除:

    1. 为每个元素调用 DELZREM

    您的要求还指定了排序和限制的需要——这些也可以在 Redis 中完成,但我建议改为在代码中处理它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多