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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
多重?l件?合查?(一)
Oct 09 PHP
PHP 模拟登陆MSN并获得用户信息
May 16 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
php定时执行任务设置详解
Feb 06 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
php7下的filesize函数
Sep 30 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 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+javascript模拟Matrix画面
2006/10/09 PHP
PHP array_push 数组函数
2009/12/26 PHP
php单链表实现代码分享
2016/07/04 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
jQuery 使用手册(四)
2009/09/23 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
WebStorm ES6 语法支持设置&amp;babel使用及自动编译(详解)
2017/09/08 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
Python模块文件结构代码详解
2018/02/03 Python
基于Python实现用户管理系统
2019/02/26 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
python3实现高效的端口扫描
2019/08/31 Python
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
财务会计应届生求职信
2013/11/24 职场文书
领导的自我鉴定
2013/12/28 职场文书
挂牌仪式主持词
2014/03/20 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
新闻稿件写作范文
2015/07/18 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
Javascript 解构赋值详情
2021/11/17 Javascript