使用Redis的List(列表)命令实现消息队列,生产者使用lPush命令发布消息,消费者使用rpoplpush命令获取消息,同时将消息放入监听队列,如果处理超时,监听者将把消息弹回消息队列
1.用到的List(列表)命令
命令 |
作用 |
lPush |
将一个或多个值插入到列表头部 |
rpoplpush |
弹出列表最后一个值,同时插入到另一个列表头部,并返回该值 |
lRem |
删除列表内的给定值 |
lIndex |
按索引获取列表内的值 |
2.队列的组成
名称 |
职责 |
生产者 |
发布消息 |
消费者 |
获取并处理消息 |
监听者 |
监听超时的消息,弹回原消息队列,确保消费者挂掉后或处理失败后消息能被其他消费者处理 |
3.php实现代码
生产者Producter.php
<?php
消费者Consumer.php
<?php
监听者Watcher.php
<?php
4.执行队列
开启监听者php Watcher.php 开启消费者php Consumer.php 执行生产者php Producter.php 生产者输出
int(1)
int(2)
int(3)
int(4)
int(5)
int(6)
int(7)
int(8)
int(9)
int(10)
监听者输出
rpoplpush:{"uniqid":"28580267323642245c4bde640dd8f3.30292468","key":"key-1","value":"data"}
rpoplpush:{"uniqid":"10258267323642245c4bde640e1cd9.95656605","key":"key-4","value":"data"}
rpoplpush:{"uniqid":"43356267323642245c4bde640e88e9.50566706","key":"key-5","value":"data"}
rpoplpush:{"uniqid":"59823267323642245c4bde640e98b5.51512314","key":"key-6","value":"data"}
rpoplpush:{"uniqid":"83293267323642245c4bde640ed753.04622366","key":"key-9","value":"data"}
消费者输出
success:{"uniqid":"47280267323557445c4bde640dbfb4.78962728","key":"key-0","value":"data"}
failure:{"uniqid":"28580267323642245c4bde640dd8f3.30292468","value":"data"}
success:{"uniqid":"39394267323642245c4bde640de992.34641654","key":"key-2","value":"data"}
success:{"uniqid":"41335267323642245c4bde640df980.38466514","key":"key-3","value":"data"}
failure:{"uniqid":"10258267323642245c4bde640e1cd9.95656605","value":"data"}
failure:{"uniqid":"43356267323642245c4bde640e88e9.50566706","value":"data"}
failure:{"uniqid":"59823267323642245c4bde640e98b5.51512314","value":"data"}
success:{"uniqid":"43817267323642245c4bde640ec189.44008738","key":"key-7","value":"data"}
success:{"uniqid":"69276267323642245c4bde640ecb91.04877522","key":"key-8","value":"data"}
failure:{"uniqid":"83293267323642245c4bde640ed753.04622366","value":"data"}
success:{"uniqid":"28580267323642245c4bde640dd8f3.30292468","value":"data"}
success:{"uniqid":"10258267323642245c4bde640e1cd9.95656605","value":"data"}
success:{"uniqid":"43356267323642245c4bde640e88e9.50566706","value":"data"}
success:{"uniqid":"83293267323642245c4bde640ed753.04622366","value":"data"}
success:{"uniqid":"59823267323642245c4bde640e98b5.51512314","value":"data"}
我们看到消费者第一次执行时失败的消息,超时后又被弹回了消息队列,消费者有了再次执行的机会,监听者的职责就是确保消费者执行失败或挂掉后消息还能再弹回原队列得到再次执行
?
转自:https://www.jmsite.cn/blog-615.html
? (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|