11.Redis系列之Stream消息队列

在介绍redis5中新引入的数据类型Streams之前,我们先了解下redis中的发布、订阅机制

1. 发布/订阅机制

# subscribe订阅channel
127.0.0.1:6379> subscribe shenjian.online
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "shenjian.online"
3) (integer) 1
# 新开一个shell,运行 publish channel msg,可以看到订阅窗口收到消息
127.0.0.1:6379> publish shenjian.online 'hello world'
(integer) 1

2.Stream消息队列基础操作

# xadd添加消息到流中, *表示根据时间戳自动创建id
127.0.0.1:6379> xadd mystream * name shenjian age 26 sex man
"1667619336374-0"
127.0.0.1:6379> xadd mystream * name shenjian age 26 sex man
"1667619516470-0"
# xdel删除指定id数据
127.0.0.1:6379> xdel mystream 1667619516470-0
(integer) 1
# xlen查看队列中消息数量
127.0.0.1:6379> xlen mystream
(integer) 1
# 获取消息列表,- +表示流中最小最大id
127.0.0.1:6379> xrange mystream - +
1) 1) "1667619336374-0"
   2) 1) "name"
      2) "shenjian"
      3) "age"
      4) "26"
      5) "sex"
      6) "man"
# xread读取消息
127.0.0.1:6379> xread count 1 block 1000 streams mystream 0
1) 1) "mystream"
   2) 1) 1) "1667619336374-0"
         2) 1) "name"
            2) "shenjian"
            3) "age"
            4) "26"
            5) "sex"
            6) "man"
# $查看消息最新,等待1s
127.0.0.1:6379> xread count 1 block 1000 streams mystream $
(nil)
(1.08s)
# xinfo查看流信息
127.0.0.1:6379> xinfo stream mystream
 1) "length"
 2) (integer) 1
 3) "radix-tree-keys"
 4) (integer) 1
 5) "radix-tree-nodes"
 6) (integer) 2
 7) "last-generated-id"
 8) "1667619516470-0"
 9) "max-deleted-entry-id"
10) "1667619516470-0"
11) "entries-added"
12) (integer) 2
13) "recorded-first-entry-id"
14) "1667619336374-0"
15) "groups"
16) (integer) 0
17) "first-entry"
18) 1) "1667619336374-0"
    2) 1) "name"
       2) "shenjian"
       3) "age"
       4) "26"
       5) "sex"
       6) "man"
19) "last-entry"
20) 1) "1667619336374-0"
    2) 1) "name"
       2) "shenjian"
       3) "age"
       4) "26"
       5) "sex"
       6) "man"

3. 创建消费者组及消费消息

# xgroup create创建两个消费者组
127.0.0.1:6379> xgroup create mystream consumer-group 0
OK
127.0.0.1:6379> xgroup create mystream consumer-group2 0
OK
# xgroup createconsumer为两个消费者组分别创建两个消费者
127.0.0.1:6379> xgroup createconsumer mystream consumer-group consumer-group-consumer
(integer) 1
127.0.0.1:6379> xgroup createconsumer mystream consumer-group consumer-group-consumer2
(integer) 1
127.0.0.1:6379> xgroup createconsumer mystream consumer-group2 consumer-group2-consumer
(integer) 1
127.0.0.1:6379> xgroup createconsumer mystream consumer-group2 consumer-group2-consumer2
(integer) 1
127.0.0.1:6379> xadd mystream * blog shenjian.online
"1667621789492-0"
# xreadgroup使用消费者组1中消费者1读取1条消息
127.0.0.1:6379> xreadgroup group consumer-group consumer-group-consumer count 1 streams mystream >
1) 1) "mystream"
   2) 1) 1) "1667619336374-0"
         2) 1) "name"
            2) "shenjian"
            3) "age"
            4) "26"
            5) "sex"
            6) "man"
# xreadgroup使用消费者组1中消费者2读取1条消息,可以看到消息为第二条,说明消费者组中消费者为竞争关系
127.0.0.1:6379> xreadgroup group consumer-group consumer-group-consumer2 count 1 streams mystream >
1) 1) "mystream"
   2) 1) 1) "1667621789492-0"
         2) 1) "blog"
            2) "shenjian.online"
# xreadgroup使用消费者组2中消费者1读取1条消息,还可以返回第一条消息,说明不同消费者组消息互不影响
127.0.0.1:6379> xreadgroup group consumer-group2 consumer-group2-consumer count 1 streams mystream >
1) 1) "mystream"
   2) 1) 1) "1667619336374-0"
         2) 1) "name"
            2) "shenjian"
            3) "age"
            4) "26"
            5) "sex"
            6) "man"
# xgroup delconsumer删除消费者
127.0.0.1:6379> xgroup delconsumer mystream consumer-group consumer-group-consumer
(integer) 1
# xgroup destroy删除消费者组
127.0.0.1:6379> xgroup destroy mystream consumer-group2
(integer) 1

4. redis stream总结

Stream实际上是一个具有消息发布/订阅功能的组件,也就常说的消息队列。其实这种类似于 broker/consumer(生产者/消费者)的数据结构很常见,比如 RabbitMQ 消息中间件、 Kafka 分布式消息系统等,而 Redis Stream 正是借鉴了 Kafaka 系统。

  • 优点: Stream 除了拥有很高的性能和内存利用率外, 它最大的特点就是提供了消息的持久化存储,以及主从复制功能,从而解决了网络断开、Redis 宕机情况下,消息丢失的问题,即便是重启 Redis,存储的内容也会存在。

  • 流程: Stream 消息队列主要由四部分组成,分别是:消息本身、生产者、消费者和消费组

11.Redis系列之Stream消息队列_第1张图片

一个 Stream 队列可以拥有多个消费组,每个消费组中又包含了多个消费者,组内消费者之间存在竞争关系。当某个消费者消费了一条消息时,同组消费者,都不会再次消费这条消息。被消费的消息 ID 会被放入等待处理的 Pending_ids 中。每消费完一条信息,消费组的游标就会向前移动一位,组内消费者就继续去争抢下消息。

11.Redis系列之Stream消息队列_第2张图片
欢迎关注公众号算法小生查看最新文章

你可能感兴趣的:(NOSQL,redis,bash,数据库)