redis数据类型 stream消息队列

Stream 是 Redis 5.0 版本 中新增的一种数据结构,它是一个高性能、持久化消息队列,可以用于实现消息的发布和订阅。Stream 可以看作是一个有序的消息队列,每个消息都有一个唯一的 ID,可以根据 ID 进行消息的查找、删除和确认。在 Stream 中,消息以键值对的形式存储,可以存储任意类型的数据。Stream 还支持多个消费者组,每个消费者组可以独立消费消息,避免消息重复消费。Stream 的引入使得 Redis 在消息队列领域更具竞争力,同时也为开发者提供了一种高效、可靠的消息处理方式。

1.Stream的结构设计

1.1 stream队列

可以通过XADD增加消息到对列中,结构是消息ID+消息内容(键值对 hash结构)

消息ID: 消息ID的形式是timestampInMillis-sequence,例如1527846880572-5,它表示当前的消息在毫米时间戳1527846880572时产生,并且是该毫秒内产生的第5条消息。消息ID可以由服务器自动生成,也可以由客户端自己指定,但是形式必须是整数-整数,而且必须是后面加入的消息的ID要大于前面的消息ID

1.2 stream消费者组

Consumer Group :消费组,使用 XGROUP CREATE 命令创建,一个消费组有多个消费者(Consumer), 这些消费者之间是竞争关系。

last_delivered_id :游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。

pending_ids :消费者(Consumer)的状态变量,作用是维护消费者的未确认的 id。 pending_ids 记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符)。如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack,它就开始减少。这个pending_ids变量在Redis官方被称之为PEL,也就是Pending Entries List,这是一个很核心的数据结构,它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理。

2.stream消息指令

-----------------------------队列相关指令-------------------------------------------

XADD - 添加消息到末尾

XTRIM - 对流进行修剪,限制长度

XDEL - 删除消息

XLEN - 获取流包含的元素数量,即消息长度

XRANGE - 获取消息列表,会自动过滤已经删除的消息

XREVRANGE - 反向获取消息列表,ID 从大到小

XREAD - 以阻塞或非阻塞方式获取消息列表

-----------------------------消费相关指令-------------------------------------------

XGROUP CREATE - 创建消费者组

XREADGROUP GROUP - 读取消费者组中的消息

XACK - 将消息标记为"已处理"

XGROUP SETID - 为消费者组设置新的最后递送消息ID

XGROUP DELCONSUMER - 删除消费者

XGROUP DESTROY - 删除消费者组

XPENDING - 显示待处理消息的相关信息

XCLAIM - 转移消息的归属权

----------------------------监控队列指令--------------------------------------------

XINFO - 查看流和消费者组的相关信息;

XINFO GROUPS - 打印消费者组的信息;

XINFO STREAM - 打印流信息

补充:

每个Pending的消息有4个属性:

  • 消息ID
  • 所属消费者
  • IDLE,已读取时长
  • delivery counter,消息被读取次数
相关推荐
tc&1 天前
为什么 Kamailio 模块封装的 MySQL 函数能有效防范 SQL 注入?
数据库·sql·mysql·网络攻击模型·kamailio
cookqq1 天前
Java+MySQL时区难题-Date自动转换String差8小时
数据库·mysql
sugarzhangnotes1 天前
MySQL 8.0升级中的字符集陷阱与解决方案
android·数据库·mysql
BD_Marathon1 天前
MyBatis核心配置文件之mappers
java·数据库·mybatis
float_六七1 天前
数据库管理系统(DBMS) 的核心组成部分
数据库·oracle
科技块儿1 天前
内网系统IP离线数据库搭建与维护完整方案
数据库·网络协议·tcp/ip
小徐不徐说1 天前
避坑指南:Qt 中 Lambda 表达式崩溃原因与高效使用实践
数据库·c++·qt·面试
chirrupy_hamal1 天前
WAL 记录的内容变种
数据库·postgresql
1***43801 天前
技术文章大纲:用MySQL玩转数据可视化数据库连接与数据查询基础
数据库·mysql·信息可视化
binbinaishijie881 天前
Matlab读取CSV数据并处理实战指南:从入门到精通
大数据·数据库·其他·matlab