redis消费组的创建与使用

1.创建消费组

命令解释

  • XGROUP CREATE mystream mygroup $
  • XGROUP CREATE mystream mygroup 0
  • XGROUP CREATE newstream mygroup $ MKSTREAM
    在创建消费者组时,我们必须指定一个ID, 表示流中当前最大的 I D ,所以指定 表示流中当前最大的ID,所以指定 表示流中当前最大的ID,所以指定将产生只使用新消息的效果。
    如果设置为0,则将消费流所有的消息记录
    MKSTREAM 表示如果newtream不存在,则创建newstream

执行命令

   XGROUP CREATE mystream mygroup $

2.消费组读取消息

命令解释

XREADGROUP [BLOCK] GROUP mygroup Alice COUNT 1 STREAMS mystream
BLOCK:它是一个同步命令与XREAD 相同
GROUP: 后面有两个参数 是必填项。消费者组的名称和消费者的名称
COUNT:与XREAD中的选项相同

消费组读取消息命令

创建了消费者组,我们使用XREADGROUP命令通过消费者组读取消息。有两个消费者Alice和Bob,看看消费组将如何向Alice或Bob发送不同的消息。

在从流中阅读之前,让我们在里面放一些消息:

> XADD mystream * message apple
1526569495631-0
> XADD mystream * message orange
1526569498055-0
> XADD mystream * message strawberry
1526569506935-0
> XADD mystream * message apricot
1526569535168-0
> XADD mystream * message banana
1526569544280-0

注意:这里的message是字段名称,apple是相关值,请记住流项是小字典。

现在使用消费组从流中读取消息

> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

XREADGROUP回复就像XREAD回复一样。然而,请注意上面提供的GROUP 。它说,我想使用消费者组mygroup从流中阅读,我是消费者Alice。每次消费者与消费者组执行操作时,它都必须指定其名称,在组内唯一标识该消费者。

上面的命令行中还有另一个非常重要的细节就是 “>”。 “>”实际上代表着一个特殊的ID.

  • 如果ID是“>” 该命令将仅返回迄今为止从未发送给其他消费者的新消息,还有一个作用,将更新消费者组的最后一个ID。

  • 如果ID是任何其他有效的数字,那么将返回传递给此指定消费者的消息集,并且是到目前为止从未与XACK确认过。

我们可以立即测试此行为,指定ID为0,没有任何COUNT选项:我们只会看到唯一的待处理消息,即关于苹果的消息:

> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

但是,如果我们确认消息已处理,它将不再是待处理消息历史记录的一部分。注意看下面代码, 执行XACK后,消费者的消息记录就少了这个apple的消息。

> XACK mystream mygroup 1526569495631-0
(integer) 1
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) (empty list or set)

如果您还不知道XACK的工作原理,请不要担心,这里在这个消费者待处理的消息记录中移除这条已经确认的消息。

现在由另一个消费者Bob读取消息

> XREADGROUP GROUP mygroup Bob COUNT 2 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569498055-0
         2) 1) "message"
            2) "orange"
      2) 1) 1526569506935-0
         2) 1) "message"
            2) "strawberry"

鲍勃要求最多两条消息,并且正在通过同一个组mygroup读取。所以发生的情况是,Redis只报告新消息。正如你所看到的,“苹果”消息没有送达,因为它已经送到了Alice,所以Bob得到了orange和strewberry,等等。

这样,Alice、Bob和组中的任何其他消费者都能够从同一流中读取不同的消息,阅读他们尚未处理消息的历史记录,或将消息标记为已处理。

有几件事要记住:

1 .消费者在第一次被提及时就会自动创建,不需要明确创建。
2.即使使用XREADGROUP,您也可以同时从多个stream key的读取,但要实现此操作,您需要在每个流中创建一个具有相同名称的消费者组.
3.XREADGROUP是一个写入命令,因为即使它从流中读取,消费者组会被修改。

消息消费流程

从消耗历史记录开始,即我们的待处理消息列表。消费者以前可能崩溃过,所以在重新启动时,我们希望重新读取未得到承认而发送给我们的消息。请注意,我们可能会多次或一次处理消息(至少在消费者失败的情况下,但也涉及Redis持久性和复制的限制,请参阅有关此主题的特定部分)。
一旦历史记录被消耗,我们得到一个空的消息列表,我们可以切换到使用>特殊ID来消耗新消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值