这个是redis5.0版本才增加的一个数据结构,其借鉴了kafka的设计,redis stream是一个消息链表,将所有的消息都串起来,每一个消息都有一个唯一的id和对应的内容,并且消息是持久化的,redis重启后,内容还存在
每个stream都有一个唯一的名称,它就是redis的key,在我们使用xadd指定追加消息时自动创建
每个stream可以挂在多个消费组,每个消费组都会有一个游标last_delivered_id在stream数组之上往前移动,表示当前消费组已经消费到哪一条消息了,注意消费组是需要手动创建的,并且每次创建需要制定消费开始的位置,然后开始的位置被用来初始化游标,每个消费组之间的状态是独立,相互不受影响,并且同一个消费组可以挂在多个消费者,这些消费者之间是竞争关系,任意一个消费者消费了游标都会进行移动,每个消费者在该组内有一个唯一的名称,其内部有个变量PEL来确保消息至少被消费了一次,从而避免被丢失的情况
其还可以支持独立消费,就像list数据结构一样,指定为 xread命令,其也可以支持等待时间并结束操作
总结:stream的消费模型借鉴了kafka的消费分组概念,它弥补了redis的pub/sub的缺陷,但是其又不同于kafka,kafka支持分区模式,stream不行,如果非要分区的话,得在客户端操作,提供不同的stream名称,对消息进行hash取模选择往哪个stream中塞
更多redis知识:https://blog.youkuaiyun.com/xiao_xia_ming/article/details/106040376
redis的stream流结构图预览