Redis消息队列
1.添加队列消息
使用Stream结构消息队列Redis版本需5.0之后
|队列|存储样式 : k1 v1 (ID 1), k2 v2 (ID 2),k3 v3 (ID 3)
-
KV键值结构,且每一条消息都有属于自己的ID
XADD streamName [NOKSTREAM] [设置消息队列的最大容量 ] * k1 v1
-
streamName1 : 队列名
-
ID由redis自动生成,格式 时间戳+递增数字
-
[NOMKSTREAM] : 如果队列不存在,是否自动创建队列。默认自动创建
例: XADD users * name jack age 21
名为users队列, 内容为[name=jack,age=21],并使用redis自动创建id
2.单消费模式
读取消息的方式之一: XREAD
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key ID
-
[COUNT count] : 每次读取消息的最大数量 ,
-
[BLOCK milliseconds] : 未接收到消息时,是否阻塞 阻塞时长, BLOCK 0 :一直阻塞等待
-
STREAMS key : 要读取消息的队列名字,key为队列名
-
ID : 起始ID,返回大于该ID的消息。 0:代表从第一个消息开始 $:代表从最新的消息开始,是未被读取的新消息
注意:用$获取最新消息可能造成消息丢失,部分消息未被消费
2.1未采用阻塞队列
XREAD COUNT 1 STREAMS users 0
-
读取队users队列中的第一个消息
消息可被多次查询 ,多个消费者查询都可
-
若队列中无消息 则无返回。(nil)
例 : XREAD COUNT 1 STREAMS users $
若无未被读取的新消息则无返回.需阻塞等待
2.2采用阻塞队列
例 : XREAD COUNT 1 BLOCK 0 STREAMS users $
阻塞业务,等待队列中新消息产生并返回消息id和等待时间。
STREAM类型消息队列的特点
-
消息可回溯
-
一个消息可以多个消费者读取
-
可以阻塞读取
-
有消息漏读的风险
3.消费者组
1.消息分流:队列中的消息会分流给不同的消费者,而不是重复的消费者
2.消息表示:消费者组会维护标识,记录最后一个被处理的消息。即使消费者宕机重启,依然从标识之后读取消息(重新处理该消息),确保每一个消息都被消费。
3.消息确认:消费者获取消息后,消息处于pending状态,并存入pengding-list。 处理完成后需要通过XACK来确认消息,确认完毕才从pengding-list移除
3.1创建消费者组
XGROUP CREAT key groupName ID [MKSTREAM]
-
key : 队列名称
-
groupName : 消费者组名称
-
ID : 起始ID表示。
-
[MKSTREAM] : 对列不存在时自动创建队列,否则无法创建消费者组
例 :XGROUP CREAT users group1 0
创建消费者组,对users队列监听,从第一个消息开始
3.2从消费者组读取消息
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key ID
-
group : 消费者组名称
-
consumer : 消费者名称
-
[NOACK] : 无需手动ACK 最好不要配置
-
STREAMS key : 指定队列名称
-
ID : 获取消息起始ID:
-
“ > ”: 从下一个未消费的消息开始
-
其他:根据ID从pengding-list中获取已消费但未确认的消息。如“ 0 ”,从pengding-list中的第一个消息开始.
-
例 : XREADGROUP GROUP cg1 c1 COUNT 1 BLOCK 2000 STREAM users >
cg1消费者组的c1消费者消费一条信息,阻塞时长2秒,监听users队列下一个未消费的消息。
XACK key group ID
-
key : 队列名称
-
group :消费者组名称
-
ID : 消费信息ID
XACK users cg1 132131231-0
确认cg1消费者组监听的users队列中 ID为132131231-0的消息
消息被消费(查询)但未被确认会进入pending状态等待确认
XPENGDING key group [[IDLE min-idle-time] start end count [consumer]]
-
key : 队列名
-
group :消费者组名
-
[IDLE min-idle-time] : 从进入pengding状态到被确认之前的等待时间。如:5000,即等待时间超过5秒的消息才去获取。
-
start end : 起始范围,ID的范围。( - + :代表最小和最大,所有的ID。)
-
[consumer] : 指定消费者。
-
count : 数量
XPENGDING users cg1 - + 10
cg1消费者组监听的users队列10个的pending状态未确认的消息,ID范围为全部
STREAM类型消息队列的特点
-
消息可回溯
-
可以多消费者争抢消息
-
可以阻塞读取
-
没有漏读风险
-
有消息确认机制,保证每一个消息都被消费至少一次