Redis条件检索和删除记录

时间:2016-03-11 07:11:18

标签: redis

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

我们在redis中实现相同的mysql逻辑几乎没有什么困难。 在Mysql中的过程如下:

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

我们如何在redis中实现相同目标?

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

如何从某些条件中按优先级从redis键顺序获取数据并从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)

1 个答案:

答案 0 :(得分:0)

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

插入:

  1. message_queue表中的每条记录都应存储在哈希中 - sql_id看起来像是一个好的密钥名称候选者。
  2. 保留一个排序集,例如message_by_time,其中每个成员都是sql_id,得分为time
  3. 查询:

    1. 使用ZRANGEBYSCORE message_by_time 0 0ZRANGEBYSCORE message_by_time -inf <replace-with-timestamp>获取初始范围。
    2. 删除:

      1. 为每个元素调用DELZREM
      2. 您的要求还指定了排序和限制的需要 - 这些也可以在Redis中完成,但我建议在代码中处理它们。