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中MD5函数使用实例代码
Jun 07 PHP
一个php导出oracle库的php代码
Apr 20 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
你可能不知道PHP get_meta_tags()函数
May 12 PHP
JavaScript创建命名空间的5种写法
Jun 24 PHP
php使用curl获取https请求的方法
Feb 11 PHP
php中实现获取随机数组列表的自定义函数
Apr 02 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
PHP+DBM的同学录程序(1)
2006/10/09 PHP
php smarty模版引擎中的缓存应用
2009/12/02 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
Python变量类型知识点总结
2019/02/18 Python
Python实现的列表排序、反转操作示例
2019/03/13 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
python numpy中cumsum的用法详解
2019/10/17 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
全球性的女装店:storets
2019/06/12 全球购物
就业推荐表自我鉴定
2013/10/29 职场文书
人事部主管岗位职责
2013/12/26 职场文书
民事赔偿协议书
2014/11/02 职场文书
2016大一新生军训感言
2015/12/08 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL