Redis Stream
Redis Stream 是 Redis 5.0 版本新增加的数据结构。
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
Redis Stream 的结构如下所示,它有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容:
每个 Stream 都有唯一的名称,它就是 Redis 的 key,在我们首次使用 xadd 指令追加消息时自动创建。
上图解析:
- Consumer Group :消费组,使用 XGROUP CREATE 命令创建,一个消费组有多个消费者(Consumer)。
- last_delivered_id :游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。
- pending_ids :消费者(Consumer)的状态变量,作用是维护消费者的未确认的 id。 pending_ids 记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符)。
原文连接:https://www.runoob.com/redis/redis-stream.html
特殊符号:- ,+ 表示最大和最小的id $只消费最新的消息 表示当前流中最大的id的下一个
* 用于xadd命令中,让系统自动生成id >用于xreadgroup命令表示迄今还没有发送给 组中使用者的信息 会更新消费者组的最后id
常用命令
1,xadd key *|id field value [field value ...] 添加消息到stream中
2,xdel key id [id ...] 根据id进行删除
3,xrange key start end [COUNT count] 遍历stream count表示遍历数目
xrange stream - + 表示全部遍历
4,xrevrange key end start [COUNT count] 反转便利
5,xtrim key MAXLEN count 按指定个数截取最大的时间戳其余的删除
6,xtrim key MINID 时间戳 截取全部小于这个时间戳的消息包括它本身
7,xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...] 读取消息
xread streams stream $ 读取当前最大的id没有返回nil
xread count 2 streams stream 0-0 从最小的id开始读取2个
8,xread block 0 streams key $ 阻塞读取直到stream中放入新的消息才会被读取到然后阻塞结束
消费者相关指令
9,xgroup create key groupname $ 表示这个消费组从尾部开始消费
10,xgroup create key groupname 0 表示从头开始消费
11,xreadgroup GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...]
例:xreadgroup group groupa consumer1 streams stream > groupa组中的消费者consum1读取全部的消息
一条信息被消费者消费完后不能被同一消费组的其它消费者再次消费但可以被其他消费组的消费者消费
基于stream实现的消费队列会自动留存消费组里每个消费者读取的信息直到消费者使用命令xack消息才会被删除
12,xpending key group [[IDLE min-idle-time] start end count [consumer]] 用于查看读取但未确认的消息(消费队列留存的消息)
13, xack key group id [id ...] 向消费队列确认消息处理已完成