使用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 从其索引中获取元素
lSet 通过索引设置元素
lRem, lRemove 通过索引删除元素
lInsert 在列表中一个元素之前或之后插入一个元素
lLen, lSize 获取列表的长度/大小
lPop 弹出列表中的第一个元素
lPush 在列表前添加一个元素
rPop 弹出列表最后一个元素
rPush 在列表末尾增加一个元素
lPushx 仅在列表存在时才在列表前添加元素
rPushX 仅在列表存在时,才在列表结尾增加元素
lTrim, listTrim 将列表修剪到指定范围

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/

最新文章

  1. C++高精度计时器&mdash;&mdash;微秒级时间统计
  2. C++和pascal之间的通信
  3. Node.js 【CORS(cross origin resource sharing) on ExpressJS之笔记】
  4. ODBC连接MySQL出现&quot;E_FAIL&quot;错误
  5. 【java】利用异常机制,往前台写错误信息
  6. windows下php+apache+mysql环境搭建
  7. UITabBarController 笔记(三) UITabBarController 配合 UINavigationController 的使用
  8. minidump详细介绍
  9. Javascript学习6 - 类、对象、继承
  10. APP 半自适应 WEB页面
  11. Developing Skills
  12. iOS 类方法 、野指针与空指针
  13. ubuntu,装完PYTHON3 pip3 install 报错
  14. 高性能异步Socket框架
  15. Smokeping安装部署
  16. 关于H5唤醒APP的功能实现(千辛万苦啊!)
  17. 加快Terminal的打开加载速度
  18. 图像等比例缩放的函数封装(PHP)
  19. python 类中的某个函数作为装饰器
  20. (asp.net)百度浏览器Cookie的神奇bug

热门文章

  1. C#&amp;.Net干货分享-构建后台自动定时任务的源码
  2. 微信小程序根据生日获取年龄
  3. 使用docker-compose安装wordpress
  4. May 19th, 2019. Week 21st, Sunday
  5. 不相交集ADT 你是和谁是一类人?
  6. 机器学习实战之KNN
  7. linux下编译时的默认库和头文件搜索路径
  8. ES6 class类中定义私有变量
  9. 集成Hive和HBase
  10. IT兄弟连 Java语法教程 数据类型3