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获取文件后缀名的三个函数
Oct 15 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
Mar 12 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
thinkPHP引入类的方法详解
Dec 08 PHP
php写app接口并返回json数据的实例(分享)
May 20 PHP
PHP实现阿里大鱼短信验证的实例代码
Jul 10 PHP
Lumen timezone 时区设置方法(慢了8个小时)
Jan 20 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 04 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字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
php的sso单点登录实现方法
2015/01/08 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
jquery 手势密码插件
2017/03/17 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
vue小白入门教程
2018/04/02 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
python提取照片坐标信息的实例代码
2019/08/14 Python
python的json包位置及用法总结
2020/06/21 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
机电工程学生自荐信范文
2013/12/07 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
幼师求职自荐信
2015/03/26 职场文书
高中信息技术教学反思
2016/02/16 职场文书
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js