持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
前言
Redis 5.0 全新的数据类型:streams,官方把它定义为:以更抽象的方式建模日志的数据结构。Redis 的streams主要是一个append only(AOF)的数据结构,至少在概念上它是一种在内存中表示的抽象 数据类型,只不过它们实现了更强大的操作,以克服日志文件本身的限制。 如果你了解MQ,那么可以把streams当做基于内存的MQ。如果你还了解kafka,那么甚至可以把streams当做基于内存的kafka。listpack存储信息,Rax组织listpack 消息链表 listpack是对ziplist的改进,它比ziplist少了一个定位最后一个元素的属性。
简介
stream的功能有点类似于redis以前的Pub/Sub,但是也有基本的不同:
- streams支持多个客户端(消费者)等待数据(Linux环境开多个窗口执行XREAD即可模拟),并且每个客户端得到的是完全相同的数据
- Pub/Sub是发送忘记的方式,并且不存储任何数据;而streams模式下,所有消息被无限期追加 在streams中,除非用于显式执行删除(XDEL)。 XDEL只做一个标记位,其实信息和长度还在
- streams的Consumer Groups也是Pub/Sub无法实现的控制方式
数据结构
它主要有消息、生产者、消费者、消费组4组成。 streams数据结构本身非常简单,但是streams依然是Redis到目前为止最复杂的类型,其原因是实现的一些额外的功能:一系列的阻塞操作允许消费者等待生产者加入到streams的新数据。另外还有一个称 为Consumer Groups的概念,Consumer Group概念最先由kafka提出,Redis有一个类似实现,和kafka的Consumer Groups的目的是一样的:允许一组客户端协调消费相同的信息流!
简单操作
## 发送消息
xadd mystream * message apple
xadd mystream * message banana
## 接收消息
xrange mystream - +
## 阻塞读取
xread block 0 streams mystream $
## 创建消费组
xgroup create mystream mygroup1 0
xgroup create mystream mygroup2 0
## 通过消费组读取消息
xreadgroup group mygroup1 zange count 2 streams mystream >
xreadgroup group mugroup2 tuge count 1 streams mystream >
使用场景
- 实时通信
- 大数据分析
- 异地数据备份