学习笔记 : Redis中基于Stream结构的消息队列

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类型消息队列的特点

  • 消息可回溯

  • 可以多消费者争抢消息

  • 可以阻塞读取

  • 没有漏读风险

  • 有消息确认机制,保证每一个消息都被消费至少一次

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值