[视频教程] 基于redis的消息队列实现与思考
使用redis的list列表来实现消息队列功能,相信大家都听过消息队列,但是在业务中可能并没有真正去使用它。在公司项目中正好有个场景使用到了消息队列,因此就来说一下流程。 web点击后的入队列很简单,就是单纯的for循环,然后使用lPush在队列的头部增加元素。 在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"; <?//后台进程 while(true$email=$redis->bRPopLPush ("emails","emails_bak",20); var_dump($email); usleep(100);模拟发信耗时 $redis->lRem("emails_bak",1)">); } redis提供的所以关于list的函数 blPop,brPop 阻塞式读取和删除第一个/最后一个元素 ? cron的规则: */30 * * * * root ps -ef |grep SendMassMail | grep -v ps |awk '{print $2}' | xargs kill -9? ;PHP /usr/local/sinamail/tools/SendMassMailAndMonitor.PHP 我的视频教程 https://www.bilibili.com/video/av73188455/ (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |