Redis数据结构之Stream
本文最后更新于 2025年5月29日
未完待续
1.概述
Redis Stream是Redis 5.0版本新增加的数据结构。
Redis Stream主要用于消息队列(MQ,Message Queue),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃,而且没有ACK机制来保证数据的可靠性,假设一个消费者都没有,那消息就直接被丢弃了,简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息。
而Redis Stream提供了消息的持久化和主备复制功能,支持自动生成全局唯一ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加的稳定和可靠,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
2.原理
Redis Stream是一个链表,会将所有加入的消息都串起来,每个消息都有一个唯一的ID和对应的内容
Redis Stream组成部分说明:
Message Content
每一个消息
Consumer group
消费组,通过XGROUP CREATE命令创建,同一个消费组可以有多个消费者
Last_delivered_id
游标,每个消费组会有个游标last_delivered_id,任意一个消费者读取了消息都会使游标last_delivered_id往前移动
Consumer
消费者,包含在消费组当中
Pending_ids
消费者会布一个状态变量,用于记录被当前消费者已读取但未ack的消息id,如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack,它就开始减少。这个pending_ids变量在Redis官方被称之为PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有ack(Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理
3.队列相关命令
3.1 XADD
添加消息到队列末尾
3.2 XTRIM
限制Stream的长度,如果已经超长会进行截取
3.3 XDEL
删除消息
3.4 XLEN
获取Stream中的消息长度
3.5 XRANGE
获取消息列表(可以指定范围),忽略删除的消息
3.6 XREVRANGE
和XRANGE相比,区别在于反向获取,ID从大到小
3.7 XREAD
获取消息(阻塞/非阻塞),返回大于指定ID的消息
"如果文章对您有帮助,可以请作者喝杯咖啡吗?"

微信支付

支付宝