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 相关文章推荐
使用eAccelerator加密PHP程序
Oct 03 PHP
PHP 验证登陆类分享
Mar 13 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
php利用事务处理转账问题
Apr 22 PHP
php实现短信发送代码
Jul 05 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
PHP实现多级分类生成树的方法示例
Feb 07 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 PHP
有关PHP 中 config.m4 的探索
Aug 26 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读取汉字的点阵数据
2015/06/22 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javascript各种复制代码收集
2008/09/20 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
JsRender for object语法简介
2014/10/31 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
Bootstrap精简教程
2015/11/27 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
vue内置指令详解
2018/04/03 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
python Django 创建应用过程图示详解
2019/07/29 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
基于Django实现日志记录报错信息
2019/12/17 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
绝对经典成功的大学生推荐信
2013/11/08 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
代领毕业证委托书
2014/08/02 职场文书
求职自我评价怎么写
2015/03/09 职场文书
大学生团日活动总结
2015/05/06 职场文书
邹越演讲观后感
2015/06/15 职场文书
60句有关成长的名言
2019/09/04 职场文书
详解python字符串驻留技术
2021/05/21 Python
vue实力踩坑之push当前页无效
2022/04/10 Vue.js