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中如何将数组变量写入文件
Jun 06 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
Nov 27 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 PHP
thinkPHP基于ajax实现的菜单与分页示例
Jul 12 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
Mar 02 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 PHP
php设计模式之装饰模式应用案例详解
Jun 17 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 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 mysql数据库操作分页类
2008/06/04 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
PHP7 弃用功能
2021/03/09 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
python字典DICT类型合并详解
2017/08/17 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
Python中Threading用法详解
2017/12/27 Python
Python封装原理与实现方法详解
2018/08/28 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
Python饼状图的绘制实例
2019/01/15 Python
python能做什么 python的含义
2019/10/12 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
EJB的角色和三个对象
2015/12/31 面试题
2014年敬老院工作总结
2014/12/08 职场文书
慰问信范文
2015/02/14 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
退伍军人感言
2015/08/01 职场文书
基于Python实现将列表数据生成折线图
2022/03/23 Python