Redis Stream

Redis 5.0版本之后提供的新的数据类型,类似于MQ,是发布订阅模式的改进

1. Streams数据结构

  每一个Streams有唯一的名称,对应了Redis的键。将所有加入的消息(xadd指令)串联起来,每个消息有一个ID

  • Consumer Group:消费组,同一个消息可以被组内成员消费,但只会有一个消费成功,保证了消费的唯一性
  • last_delivered_id:标识消费组在Stream上的消费位置,代表当前消费组正在消费该消息,每当消费者读取一条消息,last_delivered_id变量会前进
  • pending_ids(PEL):每个消费者内部的一个数组,记录已经被客户端获取,但是没有ack的消息id。为了确保消费成功。

2. 消息ID和消息内容

  由xadd命令自动创建的消息ID格式为:毫秒时间戳-序列号,代表该条消息是指定毫秒内产生的第几条消息。使用时间戳是为了支持时间的范围查找,并且保证了消息ID的自增。

  消息内容是普通的键值对

3. 增删改查命令

  1. xadd:追加消息
  2. xdel:删除消息,注意是只做一个标记
  3. xrange:获取消息列表,自动过滤已经删除的消息
  4. xlen:消息长度
  5. del:删除Stream

4. 独立消费

  使用xread命令忽略消费组,将Steam当成普通的消息队列使用。如果要进行顺序消费,在每次xread时,带上前一个消息的ID作为参数。使用xread block 秒数 命令,在指定时间内阻塞等待消息的到来,如果没有消息,返回nil

5. 创建消费者

  通过xgroup create创建消费组,需要传递初始消息ID初始化last_delivered_id

6. 组内消费

  通过xreadgroup命令,指定消费组名称,消费者名称和起始消息ID。支持阻塞等待新消息。

  读取到新消息,将消息ID添加到pending_ids中,当客户端处理完毕,使用xack指令通知服务器,该ID会被删除。

7. 问题

  1. Stream消息太多怎么办

   xadd指令可以指定最大长度 maxlen,超过指定长度,会将较老的消息干掉。

  2. PEL如何避免消息丢失

   当客户端重连后,xreadgroup命令会指定获取消息ID,一般设置为0-0,表示读取所有PEL消息以及last_delivered_id之后的消息。

8. 应用

   即时通信、大数据分析、异地数据备份、分流

 

参考:https://www.cnblogs.com/wmyskxz/p/12499532.html

posted @ 2021-03-08 16:54  walker993  阅读(206)  评论(0编辑  收藏  举报