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 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
PHP两种去掉数组重复值的方法比较
Jun 19 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
试用php中oci8扩展
Jun 18 PHP
PHP实现的迷你漂流瓶
Jul 29 PHP
php需登录的文件上传管理系统
Mar 21 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 PHP
Laravel 实现数据软删除功能
Aug 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
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
zbar解码二维码和条形码示例
2014/02/07 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Python调用C语言程序方法解析
2020/07/07 Python
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
测绘工程个人的自我评价
2013/11/10 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书