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即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
PHP多态代码实例
Jun 26 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
浅谈php的优缺点
Jul 14 PHP
CodeIgniter配置之autoload.php自动加载用法分析
Jan 20 PHP
php中实现字符串翻转的方法
Feb 22 PHP
php中Redis的应用--消息传递
Mar 28 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
Oct 16 PHP
PHP常用函数之base64图片上传功能详解
Oct 21 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
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
js实现聊天对话框
2020/02/08 Javascript
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
Python八皇后问题解答过程详解
2019/07/29 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
护士求职推荐信范文
2013/11/23 职场文书
质检员岗位职责
2013/12/17 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
青年文明号汇报材料
2014/12/23 职场文书
党支部意见范文
2015/06/02 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
Python快速实现一键抠图功能的全过程
2021/06/29 Python
Java 超详细讲解hashCode方法
2022/04/07 Java/Android