penven

博客园 首页 新随笔 联系 订阅 管理

由于使用的laravel框架,所以使用了框架自带的函数

1. 这里先创建一个链接,给一个stream里面添加数据

$streamKey = 'test:stream:queue';

        $redis = new \Redis();
        $redis->connect('127.0.0.1');

        for ($i = 0; $i < 100; $i++) {
            /**
             * 队列名
             * *: 表示由Redis自己生成消息ID:规则为[毫秒时间戳+自增数]
             * 存储的数据
             */
            $xAddResult = $redis->xAdd($streamKey, '*', ['field-'.$i => 'value:'.$i*2]);
        }

 

 

 

 

2.删除队列中的某一条消息

/**
 * 删除消息
 * 队列名
 * 消息ID
 */
 $xDelResult = $redis->xDel($streamKey, ['1609131229884-0']);

 

3.查看队列中的消息

/**
  * 取出所有的消息
  * 队列名
  * 消息开始ID: - 不限制开始ID
  * 消息结束ID: + 表示不限制
  */
  $streamResult = $redis->xRange($streamKey, '-', '+');
  dd($streamResult);

  

4.此时如果要消费队列中的消息,需要先创建一个group与队列关联起来,才可以消费队列中的消息

/**
  * 创建一个消费组
  * 操作类型:['HELP', 'SETID', 'DELGROUP', 'CREATE', 'DELCONSUMER']
  * 队列名
  * 消费者 : 这个时候自己随便起名字就可以
  * 消息ID : 0 表示从头开始 $ 表示不接收老的消息
  */
  $xGroupResult = $redis->xGroup('CREATE', $streamKey, $streamKey.':group_1', 0);
  dd($xGroupResult);

  

5.获取队列中的消息

/**
         * group
         * 消费者
         * [队列名 => '>' : 特殊>ID,这意味着使用者只想接收从未传递给任何其他使用者的消息。这只是意味着,给我新消息。
         *  队列名 => '0' : 任何其他ID(即0或任何其他有效ID或不完整的ID(仅毫秒时间部分))将具有以下效果:返回正在等待用户发送的ID大于提供的ID的命令的条目。因此,基本上,如果ID不是>,那么该命令将只允许客户端访问其挂起的条目:传递给它的消息,但尚未确认。]
         * 一次性取多少条消息
         */
        $xReadGroupResult = $redis->xReadGroup($streamKey.':group_1', 'consumerA', [$streamKey => '>'], 1);

  

 

 

6.从消费者组内读取消息并处理完成后,需确认该条消息已处理

/**
         * 确认消息已处理
         * 队列名
         * 消费者组
         * 消息ID
         */
        $xAckResult = $redis->xAck($streamKey, $streamKey.':group_1', ['1609131229885-0']);
        dd($xAckResult);

  

7. 用来获消费组或消费内消费者的未处理完毕的消息。

/**
         * 用来获消费组或消费内消费者的未处理完毕的消息。
         * 队列名
         * 消费者组
         */
        $pendingResult = $redis->xPending($streamKey, $streamKey.':group_1');
        dd($pendingResult);

  

 

 

其他更多的命令可以参考 Redis stream

 

posted on 2020-12-28 13:25  penven  阅读(758)  评论(0编辑  收藏  举报