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使之能同时支持GIF和JPEG
Oct 09 PHP
多个PHP中文字符串截取函数
Nov 12 PHP
thinkphp实现图片上传功能分享
Mar 04 PHP
Laravel框架中扩展函数、扩展自定义类的方法
Sep 04 PHP
php精确的统计在线人数的方法
Oct 21 PHP
php时间函数用法分析
May 28 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
PHP面向对象中new self()与 new static()的区别浅析
Aug 17 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
phpstudy隐藏index.php的方法
Sep 21 PHP
如何用PHP实现分布算法之一致性哈希算法
May 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
德生PL550的电路分析
2021/03/02 无线电
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
PHP实现的策略模式示例
2019/03/20 PHP
nodejs win7下安装方法
2012/05/24 NodeJs
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
Python 加密与解密小结
2018/12/06 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
Ajax主要包含了哪些技术
2014/06/12 面试题
小学岗位竞聘方案
2014/01/22 职场文书
数控技校生自我鉴定
2014/03/02 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
大学新学期计划书
2014/04/28 职场文书
车贷收入证明范本
2014/09/14 职场文书
户籍证明格式
2014/09/15 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
关于感谢信的范文
2015/01/23 职场文书
好好学习保证书
2015/02/26 职场文书
工作证明书
2015/06/15 职场文书
迎新生晚会主持词
2015/06/30 职场文书
环境卫生标语
2015/08/03 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
Python基础之元编程知识总结
2021/05/23 Python
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技