php使用redis的有序集合zset实现延迟队列应用示例


Posted in PHP onFebruary 20, 2020

本文实例讲述了php使用redis的有序集合zset实现延迟队列。分享给大家供大家参考,具体如下:

延迟队列就是个带延迟功能的消息队列,相对于普通队列,它可以在指定时间消费掉消息。

延迟队列的应用场景:

1、新用户注册,10分钟后发送邮件或站内信。

2、用户下单后,30分钟未支付,订单自动作废。

我们通过redis的有序集合zset来实现简单的延迟队列,将消息数据序列化,作为zset的value,把消息处理时间作为score,每次通过zRangeByScore获取一条消息进行处理。

<?php
class DelayQueue
{
  protected $prefix = 'delay_queue:';
  protected $redis = null;
  protected $key = '';
  public function __construct($queue, $config = [])
  {
    $this->key = $this->prefix . $queue;
    $this->redis = new Redis();
    $this->redis->connect($config['host'], $config['port'], $config['timeout']);
    $this->redis->auth($config['auth']);
  }
  public function delTask($value)
  {
    return $this->redis->zRem($this->key, $value);
  }
  public function getTask()
  {
    //获取任务,以0和当前时间为区间,返回一条记录
    return $this->redis->zRangeByScore($this->key, 0, time(), ['limit' => [0, 1]]);
  }
  public function addTask($name, $time, $data)
  {
    //添加任务,以时间作为score,对任务队列按时间从小到大排序
    return $this->redis->zAdd(
      $this->key,
      $time,
      json_encode([
        'task_name' => $name,
        'task_time' => $time,
        'task_params' => $data,
      ], JSON_UNESCAPED_UNICODE)
    );
  }
  public function run()
  {
    //每次只取一条任务
    $task = $this->getTask();
    if (empty($task)) {
      return false;
    }
    $task = $task[0];
    //有并发的可能,这里通过zrem返回值判断谁抢到该任务
    if ($this->delTask($task)) {
      $task = json_decode($task, true);
      //处理任务
      echo '任务:' . $task['task_name'] . ' 运行时间:' . date('Y-m-d H:i:s') . PHP_EOL;
      return true;
    }
    return false;
  }
}
$dq = new DelayQueue('close_order', [
  'host' => '127.0.0.1',
  'port' => 6379,
  'auth' => '',
  'timeout' => 60,
]);
$dq->addTask('close_order_111', time() + 30, ['order_id' => '111']);
$dq->addTask('close_order_222', time() + 60, ['order_id' => '222']);
$dq->addTask('close_order_333', time() + 90, ['order_id' => '333']);

然后,我们写一个php脚本,用来处理队列中的任务。

<?php
set_time_limit(0);
$dq = new DelayQueue('close_order', [
  'host' => '127.0.0.1',
  'port' => 6379,
  'auth' => '',
  'timeout' => 60,
]);
while (true) {
  $dq->run();
  usleep(100000);
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 冒泡排序算法的实现代码
Aug 08 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
Jul 19 PHP
CI(CodeIgniter)框架介绍
Jun 09 PHP
ThinkPHP之foreach标签使用概述
Jun 30 PHP
PHP发送短信代码分享
Aug 11 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
Apr 05 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 #PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 #PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 #PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 #PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 #PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 #PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 #PHP
You might like
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
JQuery toggle使用分析
2009/11/16 Javascript
js 数值项目的格式化函数代码
2010/05/14 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
2018/10/16 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
python解析html开发库pyquery使用方法
2014/02/07 Python
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
python实现SMTP邮件发送功能
2020/06/16 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
考试保密承诺书
2014/08/30 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
高中教师个人总结
2015/02/10 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
捐书仪式主持词
2015/07/04 职场文书
中秋晚会致辞
2015/07/31 职场文书
环境卫生标语
2015/08/03 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
浅谈Python项目的服务器部署
2021/04/25 Python