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 中InnoDB和MyISAM的区别分析小结
Apr 15 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
Oct 04 PHP
php缓存技术详细总结
Aug 07 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
php实现的mongodb操作类实例
Apr 03 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
php中strlen和mb_strlen用法实例分析
Nov 12 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
PHP fclose函数用法总结
Feb 15 PHP
smarty模板的使用方法实例分析
Sep 18 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
Sep 26 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中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
js 目录列举函数
2008/11/06 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
pytorch 固定部分参数训练的方法
2019/08/17 Python
python基础 range的用法解析
2019/08/23 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
如何利用python生成MD5并去重
2020/12/07 Python
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
单位单身证明范本
2014/01/11 职场文书
班级旅游计划书
2014/05/03 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
Win11更新失败并提示0xc1900101
2022/04/19 数码科技