Redis 5.0 增加了很多新的特色功能,其最大的新特性就是多出了一个数据结构 Stream,它是一个新的强大的支持多播的可持久化消息队列,其极大地借鉴了 Kafka 的设计。
Redis 流 简介
Redis Stream 的结构如下图,它有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容。消息是持久化的,Redis 重启后,内容还在。
每个 Stream 都有唯一的名称,它就是 Redis 的 key,在我们首次使用 xadd 指令追加消息时自动创建。
每个 Stream 都可以挂多个消费组(Consumer Group),每个消费组会有个游标 last_delivered_id 在 Stream 数组之上往前移动,表示当前消费组已经消费到哪条消息了。每个消费组都有一个 Stream 内唯一的名称,消费组不会自动创建,它需要单独的指令 xgroup create 进行创建,需要指定从 Stream 的某个消息 ID 开始消费,这个 ID 用来初始化 last_delivered_id 变量。
每个消费组的状态都是独立的,相互不受影响。也就是说同一份 Stream 内部的消息会被每个消费组都消费到。
同一个消费组可以挂接多个消费者(Consumer),这些消费者之间是竞争关系,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。每个消费者有一个组内唯一名称。
消费者内部会有一个状态变量 pending_ids,它记录了当前已经被客户端读取,但是还没有 ack 的消息。如果客户端没有 ack,这个变量里面的消息 ID 就会越来越多,一旦某个消息被 ack,它就开始减少。这个 pending_ids 变量在 Redis 官方被称为 PEL,也就是 Pending Entries List,这是一个核心的数据结构,它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了而没被处理。
Redis 流命令
可用版本 | 命令及描述 |
---|---|
>=5.0.0 |
用于从流的消费者组的待处理条目列表中删除一条或多条消息。 |
>=5.0.0 |
XADD key ID field value [field value ...] 将指定的流条目追加到指定 key 的流中。 |
>=5.0.0 |
在流的消费者组上下文中,改变待处理消息的所有权。 |
>=5.0.0 |
从指定流中移除指定的条目。 |
>=3.0.0 |
CLUSTER FAILOVER [FORCE|TAKEOVER] 只能在集群的 slave 节点上执行,让 slave 节点进行一次人工故障切换。 |
>=3.0.0 |
从收到命令的 Redis 集群节点的节点信息列表中移除指定 ID 的节点。 |
>=3.0.0 |
CLUSTER GETKEYSINSLOT slot count 返回存储在连接节点的指定哈希插槽(hash slot)里面的 key 名称列表。 |
>=3.0.0 |
显示当前连接的集群的各种信息。 |
>=3.0.0 |
返回一个整数,用于标识指定键所散列到的哈希槽。 |
>=3.0.0 |
被用来连接不同的开启集群支持的 Redis 节点,以进入工作集群。 |
>=3.0.0 |
对集群中的每个节点都有当前集群配置的一个视图(快照)。 |
>=5.0.0 |
列出指定主节点的副本节点的集群信息。 |
>=3.0.0 |
重新配置一个节点成为指定 master 的 salve 节点。 |
>=3.0.0 |
重置集群中的一个节点。 |
>=3.0.0 |
强制保存配置 nodes.conf 至磁盘。 |
>=3.0.0 |
CLUSTER SET-CONFIG-EPOCH config-epoch 为一个全新的节点设置指定的 config epoch。 |
>=3.0.0 |
CLUSTER SETSLOT slot IMPORTING|MIGRATING|STABLE|NODE [node-id] 根据子命令选项,修改接受节点中哈希槽的状态。 |
>=3.0.0 |
会列出指定 master 节点的所有 slave 节点。 |
>=3.0.0 |
返回哈希槽和 Redis 实例映射关系。 |
>=3.0.0 |
开启与 Redis Cluster 从节点连接的读请求。 |
>=3.0.0 |
禁止与 Redis Cluster 从节点连接的读请求。 |