前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[视频教程] 基于redis的消息队列实现与思考

[视频教程] 基于redis的消息队列实现与思考

作者头像
唯一Chat
发布2019-10-25 04:12:27
7660
发布2019-10-25 04:12:27
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

使用redis的list列表来实现消息队列功能,相信大家都听过消息队列,但是在业务中可能并没有真正去使用它。在公司项目中正好有个场景使用到了消息队列,因此就来说一下流程。 在web界面上有个功能是群发邮件,用户可以创建一个5000邮箱的邮件列表,编辑完邮件内容后可以给这个邮件列表发信。如果使用同步的方式,直接在浏览器-服务器模式下调用smtp服务发信,肯定速度非常慢,也有可能会超时。现在就是在点完发信后,进入到redis的一个list中,然后直接给用户返回发送成功。至于这些信什么时候发送和完成,都是对用户透明的。在后台进程任务中会去消费list数据,逐条进行发信。

web点击后的入队列很简单,就是单纯的for循环,然后使用lPush在队列的头部增加元素。 后台使用定时任务每隔30分钟启动php进程,去消费list中的数据,并且kill掉之前的php进程。这样做是为了防止PHP进程僵死,定时重启进程来进行操作。

在kill掉进程的时候,有可能会导致正在发信的过程被结束,取出的数据没有被发送成功。redis有提供一个功能是在弹出数据的同时,可以插入到另一个队列中,并且这个操作是原子性的,这样就使用另一个备用队列来存储发送失败的数据,重新进行补偿发送

代码语言:javascript
复制
<?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";
代码语言:javascript
复制
<?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/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档