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 相关文章推荐
用mysql内存表来代替php session的类
Feb 01 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
php SQL Injection with MySQL
Feb 27 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
简单实现PHP留言板功能
Dec 21 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
laravel中Redis队列监听中断的分析
Sep 14 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
一个好用的分页函数
2006/11/16 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
解读ES6中class关键字
2017/11/20 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
Python中的装饰器用法详解
2015/01/14 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
三星英国官网:Samsung英国
2018/09/25 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
汉语专业应届生求职信
2013/10/01 职场文书
大二学期个人自我评价
2014/01/13 职场文书
九年级化学教学反思
2014/01/28 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
公务员政审材料范文
2014/12/23 职场文书
财产保全担保书
2015/01/20 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers