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开发框架kohana3 自定义路由设置示例
Jul 14 PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 PHP
php生成QRcode实例
Sep 22 PHP
html静态页面调用php文件的方法
Nov 13 PHP
php+jQuery.uploadify实现文件上传教程
Dec 26 PHP
深入浅析Yii admin的权限控制
Aug 31 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 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
php方法调用模式与函数调用模式简例
2011/09/20 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
jquery获取input表单值的代码
2010/04/19 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
js中new一个对象的过程
2017/02/20 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
全面了解Python环境配置及项目建立
2016/06/30 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
python实现的发邮件功能示例
2019/09/11 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
文艺晚会主持词
2014/03/24 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
教师学期末个人总结
2015/02/13 职场文书
导游词之江南周庄
2019/12/06 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python