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写的小东西
Dec 06 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
May 28 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
php查看当前Session的ID实例
Mar 16 PHP
php链表用法实例分析
Jul 09 PHP
php生成验证码函数
Oct 20 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
Admin generator, filters and I18n
2011/10/06 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
vue+animation实现翻页动画
2020/06/29 Javascript
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
IRO美国官网:法国服装品牌
2018/03/06 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
社区活动总结报告
2014/05/05 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
亲属关系公证书样本
2015/01/23 职场文书
地道战观后感2000字
2015/06/04 职场文书
幽灵公主观后感
2015/06/09 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
物业保洁员管理制度
2015/08/05 职场文书
POST提交数据常见的四种方式
2022/01/18 HTML / CSS
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python