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 相关文章推荐
fleaphp rolesNameField bug解决方法
Apr 23 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
PHP获取时间排除周六、周日的两个方法
Jun 30 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
php正则表达式获取内容所有链接
Jul 24 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 PHP
PHP7 字符串处理机制修改
Mar 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
8个必备的PHP功能实例代码
2013/10/27 PHP
php实现多城市切换特效
2015/08/09 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
原生js实现分页效果
2020/09/23 Javascript
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python中的一些类型转换函数小结
2013/02/10 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
给交警的表扬信
2014/01/12 职场文书
2014庆六一活动方案
2014/03/02 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
公司联欢会策划方案
2014/05/19 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
网络妈妈观后感
2015/06/08 职场文书
参加招聘会后的感想
2015/08/10 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS
MySQL GRANT用户授权的实现
2021/06/18 MySQL