php基于Redis消息队列实现的消息推送的方法


Posted in PHP onNovember 28, 2018

基本知识点

重点用到了以下命令实现我们的消息推送

  • brpop 阻塞模式 从队列右边获取值之后删除
  • brpoplpush 从队列A的右边取值之后删除,从左侧放置到队列B中

逻辑分析

  • 在普通的任务脚本中写入push_queue队列要发送消息的目标,并为目标设置一个要推送的内容,永不过期
  • RedisPushQueue中brpoplpush处理,处理后的值放到temp_queue,主要防止程序崩溃造成推送失败
  • RedisAutoDeleteTempqueueItems处理temp_queue,这里用到了brpop

代码实现

普通任务脚本

<?php
foreach ($user_list as $item) {
  //命名规则 业务类型_操作_ID_随机6位 值 自定义 我自定义的是"推送内容"
  $k_name = 'rabbit_push_' . $item['uid'].'_'.rand(100000,999999);
  $redis->lPush('push_queue',$k_name);//左进队列
  $redis->set($k_name, '推送内容');
}

RedisPushQueue

<?php
//消息队列处理推送~
//
 // 守护进程运行
 // nohup php YOURPATH/RedisPushQueue.php & 开启守护进程运行,修改文件之后需要从新启动
// blpop 有值则回去 没值则阻塞 主要就是这个函数在起作用 不过并不安全,程序在执行过程中崩溃就会导致队列中的内容
 // 永久丢失~
 // BRPOPLPUSH 阻塞模式 右边出 左边进 在填写队列内容的时候要求从左进入
 //
ini_set('default_socket_timeout', -1); //不超时
require_once 'YOURPARH/Rongcloud.php';

$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->select(2);//切换到db2
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);

// temp_queue临时队列防止程序崩溃导致队列中内容丢失 0代表永不超时!
While ($key = $redis->brpoplpush('push_queue', 'temp_queue', 0)) {
  if ($val = $redis->get($key)) {
    //rabbit_push_20_175990
    $arr = explode('_', $key);
    if (count($arr) != 4) {
      continue;
    }
    $id = $arr[2];
    push($id, $val);
    //删除key内容
    $redis->del($key);
  } 
}
function push($id, $v)
{
 //推送操作~
}

RedisAutoDeleteTempqueueItems

<?php
/* 自动处理temp_queue中的元素,这个操作是防止RedisPushQueue崩溃的时候做处理
 处理思路是 使用brpop 命令阻塞处理temp_queue这个队列中的值,如果能获取到"值"对应的"值",说明RedisPushQueue执行失败了
 将值还lpush到push_queue中,以备从新处理
 至于为什么使用brpop命令,是因为在RedisPushQueue中我们使用的是brpoplpush
 nohup php YOURPATH/RedisAutoDeleteTempqueueItems.php & 开启守护进程运行,修改文件之后需要从新启动
*/
ini_set('default_socket_timeout', -1); //不超时
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->select(2);//切换到db2
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
  while($key_arr = $redis->brPop('temp_queue',0)){
  if(count($key_arr) != 2){
    continue;
  }
  $key =$key_arr[1];
  if($redis->get($key)){//能获取到值 说明RedisPushQueue执行失败
    $redis->lPush('push_queue',$key);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
表单复选框向PHP传输数据的代码
Nov 13 PHP
php2html php生成静态页函数
Dec 08 PHP
使用XDebug调试及单元测试覆盖率分析
Jan 27 PHP
jQuery Mobile + PHP实现文件上传
Dec 12 PHP
php版微信数据统计接口用法示例
Oct 12 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 14 PHP
PHP 对象继承原理与简单用法示例
Apr 21 PHP
Yii 实现数据加密和解密
Mar 09 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 #PHP
PHP实现小程序批量通知推送
Nov 27 #PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 #PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
Nov 20 #PHP
phpMyAdmin通过密码漏洞留后门文件
Nov 20 #PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 #PHP
关于php unset对json_encode的影响详解
Nov 14 #PHP
You might like
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
Python实现的端口扫描功能示例
2018/04/08 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
电子商务专业学生的自我鉴定
2013/11/28 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
工作个人的自我评价
2014/01/14 职场文书
母亲七十大寿答谢词
2014/01/18 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
家长对孩子的感言
2014/03/10 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
会议通知格式范文
2015/04/15 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android