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 20 PHP
PHP开发的一些注意点总结
Oct 12 PHP
PHP学习 变量使用总结
Mar 24 PHP
php调用mysql数据 dbclass类
May 07 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
Jun 10 PHP
yii用户注册表单验证实例
Dec 26 PHP
Yii2框架使用计划任务的方法
May 25 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
在PHP中实现使用Guzzle执行POST和GET请求
Oct 15 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 PHP
Laravel实现批量更新多条数据
Apr 06 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 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
js常用DOM方法详解
2017/02/04 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
python和bash统计CPU利用率的方法
2015/07/10 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
对于Python深浅拷贝的理解
2019/07/29 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
Html5定位终极解决方案
2020/02/05 HTML / CSS
教师专业理论水平的自我评价分享
2013/11/09 职场文书
运动会邀请函范文
2014/02/06 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
Vue3中的Refs和Ref详情
2021/11/11 Vue.js
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers