redis:基于 Streams 的消息队列

前言

Redis 5.0 及 5.0 以后的版本提供的Streams 是专门为消息队列设计的数据类型,它提供了丰富的消息队列操作命令。

消息队列

Streams 操作 

XADD:插入消息,保证有序,可以自动生成全局唯一 ID;

名称为 mqstream 的消息队列中插入一条消息:

127.0.0.1:6379> xadd mqstream * high 168
"1683981116051-0"

消息的键是 high

值是 168

mqstream 后面的*:表示让 Redis 为插入的数据自动生成一个全局唯一的 ID,也可以不用*,直接在消息队列名称后设定一个全局唯一 ID 号。

XREAD:用于读取消息,可以按 ID 读取数据;

1683981116051-0后所有消息:

127.0.0.1:6379> xread block 100 streams mqstream 1683981116051-0
1) 1) "mqstream"
   2) 1) 1) "1683983220880-0"
         2) 1) "high"
            2) "169"
      2) 1) "1683983231594-0"
         2) 1) "high"
            2) "170"

block 配置项:阻塞读取操作,类似于Redis的list类型BRPOP操作

127.0.0.1:6379> xread block 10000 streams mqstream $
(nil)
(10.09s)
block 10000 的配置项:10000 的单位是毫秒,如果没有新消息,阻塞10秒然后返回

(nil):表示没有新消息

 XREADGROUP:按消费组形式读取消息;

创建一个名为 grouphigh 的消费组,这个消费组消费的消息队列是 mqstream:

127.0.0.1:6379> xgroup create mqstream grouphigh 0
OK

消费组的消费者读取mqstream的所有消息

127.0.0.1:6379> xreadgroup group grouphigh consumer1 streams mqstream >
1) 1) "mqstream"
   2) 1) 1) "1683981116051-0"
         2) 1) "high"
            2) "168"
      2) 1) "1683983220880-0"
         2) 1) "high"
            2) "169"
      3) 1) "1683983231594-0"
         2) 1) "high"
            2) "170"

grouphigh:消费者

consumer1 :消费者

>:从第一条读取未被消费的消息

127.0.0.1:6379> xreadgroup group grouphigh consumer2 streams mqstream 0
1) 1) "mqstream"
   2) (empty list or set)

因为consumer1 读取了grouphigh中的数据就表示已经消费,consumer2就读取不到了

XPENDING :用来查询每个消费组内所有消费者已读取但尚未确认的消息; 

为了保证消费者在发生故障或宕机再次重启后,仍然可以读取未处理完的消息,Streams 会自动使用内部队列(也称为 PENDING List)留存消费组里每个消费者读取的消息,直到消费者使用 XACK 命令通知 Streams“消息已经处理完成”。如果消费者没有成功处理消息,它就不会给 Streams 发送 XACK 命令,消息仍然会留存。此时,消费者可以在重启后,用 XPENDING 命令查看已读取、但尚未确认处理完成的消息。

查看grouphigh消费者 中各个消费者已读取、但未确认的消息个数:

127.0.0.1:6379> xpending mqstream grouphigh
1) (integer) 3
2) "1683981116051-0"
3) "1683983231594-0"
4) 1) 1) "consumer1"
      2) "3"

查看某个消费者具体读取数据:

127.0.0.1:6379> xpending mqstream grouphigh - + 10 consumer1
1) 1) "1683981116051-0"
   2) "consumer1"
   3) (integer) 653197
   4) (integer) 2
2) 1) "1683983220880-0"
   2) "consumer1"
   3) (integer) 653197
   4) (integer) 2
3) 1) "1683983231594-0"
   2) "consumer1"
   3) (integer) 653197
   4) (integer) 2

XACK :用于向消息队列确认消息处理已完成。

通知 Streams 1683981116051-0消息已经被读取:

xack mqstream grouphigh 1683981116051-0
(integer) 1
127.0.0.1:6379> xpending mqstream grouphigh - + 10 consumer1
1) 1) "1683983220880-0"
   2) "consumer1"
   3) (integer) 944785
   4) (integer) 2
2) 1) "1683983231594-0"
   2) "consumer1"
   3) (integer) 944785
   4) (integer) 2
127.0.0.1:6379>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis通过引入Stream类型来实现消息队列StreamRedis最复杂的数据结构之一,也是Redis 5.0的一个重要更新。Stream主要用于消息队列,类似于腾讯云的CMQ、阿里的RocketMQ、ActiveMQ、RabbitMQ以及Kafka等常见的消息队列系统。 相比于Redis的发布订阅(pub/sub)功能,Stream提供了消息的持久化和主备复制的功能,可以保证消息不丢失,并且能够记录历史消息。这意味着即使出现网络断开或Redis宕机等情况,消息也不会丢失。同时,Stream还能够让任何客户端访问任何时刻的数据,并能够记住每个客户端的访问位置。 总之,RedisStream类型是用于实现消息队列的一种数据结构,它提供了持久化和主备复制的功能,确保消息不丢失,并且能够记录历史消息,方便客户端访问和管理消息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [redis stream 实现消息队列](https://blog.csdn.net/m0_61083409/article/details/126113987)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis(十二):Redis消息队列Stream](https://blog.csdn.net/MOU_IT/article/details/118035402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值