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生成xml简单实例代码
Dec 16 PHP
PHP执行批量mysql语句的解决方法
May 02 PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
功能强大的php分页函数
Jul 20 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 PHP
PHP常用正则表达式精选(推荐)
May 28 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 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
mysq GBKl乱码
2006/11/28 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
PHP实现百度人脸识别
2019/05/06 PHP
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
护理实习自我鉴定
2013/12/14 职场文书
乐观大学生的自我评价
2014/01/10 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
2014年党支部学习材料
2014/05/19 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
论群众路线学习笔记
2014/11/06 职场文书
2014年生产部工作总结
2014/12/17 职场文书
灵山大佛导游词
2015/02/04 职场文书
名人传读书笔记
2015/06/26 职场文书
2015秋季开学典礼新闻稿
2015/07/17 职场文书
军训通讯稿范文
2015/07/18 职场文书
导游词之天津古文化街
2019/11/09 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS