由于使用的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);