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基础知识:类与对象(4) 范围解析操作符(::)
Dec 13 PHP
Dedecms常用函数解析
Feb 01 PHP
php mssql 分页SQL语句优化 持续影响
Apr 26 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
php文件操作相关类实例
Jun 18 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
Mar 07 PHP
php ajax实现文件上传进度条
Mar 29 PHP
php 多文件上传的实现实例
Oct 23 PHP
PHP 中常量的知识整理
Apr 14 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 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
深入解析php模板技术原理【一】
2008/01/10 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
js压缩利器
2007/02/20 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
js实现简单计算器
2015/11/22 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
中国最大的名表商城:万表网
2016/08/29 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
园林系毕业生求职信
2014/06/23 职场文书
安全月宣传标语
2014/10/07 职场文书
产品调价通知函
2015/04/20 职场文书
学校财务管理制度
2015/08/04 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
自考生自我评价
2019/06/21 职场文书
python编程项目中线上问题排查与解决
2021/11/01 Python