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 相关文章推荐
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
Oct 08 PHP
PHP 万年历实现代码
Oct 18 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
PHP实现QQ快速登录的方法
Sep 28 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
php实现的PDO异常处理操作分析
Dec 27 PHP
thinkphp5 路由分发原理
Mar 18 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
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
如何正确配置Nginx + PHP
2016/07/15 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
js 居中漂浮广告
2010/03/21 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
js面向对象编程总结
2017/02/16 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
Python实现批量下载文件
2015/05/17 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
python requests使用socks5的例子
2019/07/25 Python
pytorch masked_fill报错的解决
2020/02/18 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
python爬取招聘要求等信息实例
2020/11/20 Python
如何填写个人简历自我评价
2013/12/10 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
政风行风整改方案
2014/10/25 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android