使用redis的list列表来实现消息队列功能,相信大家都听过消息队列,但是在业务中可能并没有真正去使用它。在公司项目中正好有个场景使用到了消息队列,因此就来说一下流程延续的反义词。
在web界面上有个功能是群发邮件,用户可以创建一个5000邮箱的邮件列表,编辑完邮件内容后可以给这个邮件列表发信。如果使用同步的方式,直接在浏览器-服务器模式下调用smtp服务发信,肯定速度非常慢,也有可能会超时。现在就是在点完发信后,进入到redis的一个list中,然后直接给用户返回发送成功。至于这些信什么时候发送和完成,都是对用户透明的。在后台进程任务中会去消费list数据,逐条进行发信。
web点击后的入队列很简单,就是单纯的for循环,然后使用lpush在队列的头部增加元素。
后台使用定时任务每隔30分钟启动php进程,去消费list中的数据,并且kill掉之前的php进程。这样做是为了防止php进程僵死,定时重启进程来进行操作。
在kill掉进程的时候,有可能会导致正在发信的过程被结束,取出的数据没有被发送成功。redis有提供一个功能是在弹出数据的同时,可以插入到另一个队列中,并且这个操作是原子性的,这样就使用另一个备用队列来存储发送失败的数据,重新进行补偿发送
<?php/** * 模拟web入队列 */$redis=new redis();$redis->connect('192.168.1.114', 6379);for($i=0;$i<5000;$i++){ $message="mes {$i}"; $redis->lpush("emails",$message);}echo "ok";
<?php//后台进程$redis=new非诚勿扰女嘉宾劳佳 redis();$redis->connect('192.168.1.114', 6379);while(true){ $email=$redis->brpoplpush ("emails","emails_bak",20); var_dump($email); usleep(100);//模拟发信耗时 $redis->lrem("emails_bak",$email);}
redis提供的所以关于list的函数
blpop, brpop 阻塞式读取和删除第一个/最后一个元素
brpoplpush 从列表中弹出一个值,并把它推到另一个列表中
rpoplpush 弹出列表中的最后一个元素,并把他推到另一个列表中
lrange, lgetrange 获取列表中一系列元素
lindex, lget 从其索引中获取元素
lt 通过索引设置元素
lrem, lremove 通过索引删除元素
linrt 简单拟人句在列表中一个元素之前或之后插入一个元素
llen, lsize 获取列表的长度/大小
lpop 弹出列表中的第一个元素
lpush 在列表前添加一个元素
rpop 弹出列表最后一个元素
rpush 在列表末尾增加一个元素
lpushx 仅在列表存在时才在列表前添加元素
rpushx 仅在列表存在时,才在列表结尾增加元素
ltrim, li危险八国是哪八国sttrim 将列表修初中体育教案剪到指定范围
cron的规则:
*/30 * * * * root ps -ef |grep ndmassmail | grep -v ps |awk ‘{print $2}’ | xargs kill -9 ;php /usr/local/sinamail/tools/ndmassmailandmonitor.php
我的视频教程
本文发布于:2023-04-07 18:54:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/fb0806da85911407c5296e08e020b850.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:[视频教程] 基于redis的消息队列实现与思考.doc
本文 PDF 下载地址:[视频教程] 基于redis的消息队列实现与思考.pdf
留言与评论(共有 0 条评论) |