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 Squid中可缓存的动态网页设计
Sep 17 PHP
10条PHP编程习惯助你找工作
Sep 29 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
Jun 06 PHP
PHP可变函数的使用详解
Jun 14 PHP
php实现随机显示图片方法汇总
May 21 PHP
PHP中的流(streams)浅析
Jul 02 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
Oct 03 PHP
php如何实现数据库的备份和恢复
Nov 30 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
javascript multibox 全选
2009/03/22 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
Python处理字符串之isspace()方法的使用
2015/05/19 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
Python 如何实现访问者模式
2020/07/28 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
大学毕业后的十年规划
2014/01/07 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
机械专业求职信
2014/05/25 职场文书
班级体育活动总结
2014/07/05 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
民事起诉书范本
2015/05/19 职场文书
Python入门之基础语法详解
2021/05/11 Python
python实现双向链表原理
2022/05/25 Python
移除Selenium中window.navigator.webdriver值
2022/06/10 Python