[视频教程] 基于redis的消息队列实现与思考
使用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/
[视频教程] 基于redis的消息队列实现与思考的更多相关文章
- 基于Redis的消息队列php-resque
转载:http://netstu.5iunix.net/archives/201305-835/ 最近的做一个短信群发的项目,需要用到消息队列.因此开始了我对消息队列选型的漫长路. 为什么选型会纠结呢 ...
- 基于Redis的消息队列使用:spring boot2.0整合redis
一 . 引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...
- 程序员过关斩将--redis做消息队列,香吗?
Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...
- Redis 做消息队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...
- Redis作为消息队列服务场景应用案例
NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例 一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- redis resque消息队列
Resque 目前正在学习使用resque .resque-scheduler来发布异步任务和定时任务,为了方便以后查阅,所以记录一下. resque和resque-scheduler其优点在于功能比 ...
- HQueue:基于HBase的消息队列
HQueue:基于HBase的消息队列 凌柏 1. HQueue简介 HQueue是一淘搜索网页抓取离线系统团队基于HBase开发的一套分布式.持久化消息队列.它利用HTable存储消息数据 ...
- 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能
springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...
- 【Redis】php+redis实现消息队列
在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2) ...
随机推荐
- Burpsuite抓取https数据包
Burpsuite抓取https包 浏览器代理设置 Burpsuite代理设置 启动Burpsuite,浏览器访问127.0.0.1:8080,点击CA Certificate,下载cacert.de ...
- Cesium专栏-地形开挖(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- 微信小程序支付功能 C# .NET开发
微信小程序支付功能的开发的时候坑比较多,不过对于钱的事谨慎也是好事.网上关于小程序支付的实例很多,但是大多多少有些问题,C#开发的更少.此篇文档的目的是讲开发过程中遇到的问题做一个备注,也方便其他开发 ...
- 用了这么久HTTP, 你是否了解Content-Length?
摘要: 理解HTTP协议... 原文:用了这么久HTTP, 你是否了解Content-Length和Transfer-Encoding ? 作者:朴瑞卿的博客 由Content-Length导致的问题 ...
- 不相交集ADT 你是和谁是一类人?
//不相交集ADT (抽象数据类型) //一般用于集合运算 //用树,这种结构组成,有多个树(=森林) //属于同一颗数的元素,表示处于同一个集合中 //主要支持2个操作. //1. Find操作,找 ...
- skkyk:点分治
由题开始== 例题:求在一棵有权树上,是否存在一条路径满足权值和为K 解法:以每个点为根一次,看在他的子树间是否存在两段,其和为K;O(==) 和例题一样,对于树上问题,求某些要求的路径(数量或者存在 ...
- MySQL中count和sum使用
count COUNT()函数里面的参数是列名的的时候,那么会计算有值项的次数.(NULL 不计入, 但是''值计入) COUNT(*)可以计算出行数,包括null COUNT(1)也可以计算出行数, ...
- Ubuntu sudo 免密码
sudo visudo 这里默认打开的是 nano 编辑器,不习惯可以把默认编辑器换成 vim, 参考 Ubuntu 修改默认编辑器 test ALL=NOPASSWD: ALL
- SourceTree3.2.6版本跳过注册办法
一.去sourceTree官网下载最新的包 官网:https://www.sourcetreeapp.com/windows版下载地址:https://product-downloads.atlass ...
- ReactNative: ReactNative初始项目的结构
一.介绍 初学RN,一切皆新.在上篇中成功地创建并运行了一个React-Native项目,这个demo的基本结构都是系统已经创建好的,开发者在此结构下完成自己的开发即可.分别用Xcode和WebSto ...