redis延迟队列php,redis延迟队列如何实现

本文目录一览:

php使用redis的有序集合zset实现延迟队列

延迟队列就是个带延迟功能的消息队列,相对于普通队列,它可以在指定时间消费掉消息。

我们通过redis的有序集合zset来实现简单的延迟队列,将消息数据序列化,作为zset的value,把消息处理时间作为score,每次通过zRangeByScore获取一条消息进行处理。

然后,我们写一个php脚本,用来处理队列中的任务。

TP6队列think-queue(延时队列/自动取消订单/php自动操作)

什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。

延时队列在项目中的应用还是比较多的,尤其像电商类平台订单成功后,在30分钟内没有支付,自动取消订单

外卖平台发送订餐通知,下单成功后60s给用户推送短信。

如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存

淘宝新建商户一个月内还没上传商品信息,将冻结商铺等

……

上边的这些场景都可以应用延时队列解决。

1.安装think-queue

2.安装redis

3.配置,项目\config\queue.php

4.创建队列和推送

新增 \app\job\test.php 控制器,在该控制器中添加 fire 方法

fire方法是消息队列默认调用的方法

5.在项目中进行调用延时队列方法

6.添加监听 – 重要必要有这个监听,Queue::later才有效

Redis使用zset有序集合做延迟队列

把所有需要在未来执行的任务都添加到有序集合里面,并将任务的执行时间设置为分值,另外再使用一个进程来查找有序集合里面是否存在可以立即执行的任务,如果有的话,就从有序集合里面移除那个任务,并将它添加到适当的任务队列里面。

–出自《Redis实战》

创建函数 addFutureJob,负责将延迟任务添加到有序集合job中。

有序集合里存储的元素,可以使用json格式保存。

内部结构可以类似如下这种:

参数:

$job: 存储延迟任务的有序集合的名字,叫job

$queue: 当任务到达执行时间时,转存到具体的队列里执行

$fun: 负责执行的函数名称或匿名函数

$time: 延迟任务执行的具体时间

$parameter: 传递的参数

执行脚本后,将存储到job 这个有序集合里

另一个脚本中,读取job集合,检查是否有需要执行的任务

这个函数getQueue()的基本流程是这样:

(1)根据分数从小到大排列,读取第一个元素。如果元素不存在返回false

(2) 如果元素任务存在,并且它的分数(执行时间)小于等于当前时间,说明这个任务可以执行了。

(3) json转化成数组,读取任务的queue参数,将它添加到指定的队列里,然后从job中删除这个任务。

(4) 上述转移操作时,如果成功,记录日志。while继续循环检查job有序集合

(5) 如果转移操作失败,返回false

(6) 后续没有要执行的任务时,停止循环,返回false

此处循环读取也可以使用zrangeByScore()函数,根据分数范围进行读取返回集合内的指定元素。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/275899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-17 19:37
下一篇 2024-12-17 19:37

相关推荐

  • PHP和Python哪个好找工作?

    PHP和Python都是非常流行的编程语言,它们被广泛应用于不同领域的开发中。但是,在考虑择业方向的时候,很多人都会有一个问题:PHP和Python哪个好找工作?这篇文章将从多个方…

    编程 2025-04-29
  • 如何实现图像粘贴到蒙版

    本文将从多个方面介绍图像粘贴到蒙版的实现方法。 一、创建蒙版 首先,在HTML中创建一个蒙版元素,用于接收要粘贴的图片。 <div id=”mask” style=”widt…

    编程 2025-04-29
  • Python中的队列定义

    本篇文章旨在深入阐述Python中队列的定义及其应用,包括队列的定义、队列的类型、队列的操作以及队列的应用。同时,我们也会为您提供Python代码示例。 一、队列的定义 队列是一种…

    编程 2025-04-29
  • RabbitMQ和Yii2的消息队列应用

    本文将探讨RabbitMQ和Yii2之间的消息队列应用。从概念、安装和配置、使用实例等多个方面详细讲解,帮助读者了解和掌握RabbitMQ和Yii2的消息队列应用。 一、Rabbi…

    编程 2025-04-29
  • PHP怎么接币

    想要在自己的网站或应用中接受比特币等加密货币的支付,就需要对该加密货币拥有一定的了解,并使用对应的API进行开发。本文将从多个方面详细阐述如何使用PHP接受加密货币的支付。 一、环…

    编程 2025-04-29
  • Django ORM如何实现或的条件查询

    在我们使用Django进行数据库操作的时候,查询条件往往不止一个,一个好的查询语句需要考虑我们的查询要求以及业务场景。在实际工作中,我们经常需要使用或的条件进行查询,本文将详细介绍…

    编程 2025-04-29
  • Python一次性输入10个数如何实现?

    Python提供了多种方法进行输入,可以手动逐个输入,也可以一次性输入多个数。在需要输入大量数据时,一次性输入十个数就非常方便。下面我们从多个方面来讲解如何一次性输入10个数。 一…

    编程 2025-04-28
  • 使用PHP foreach遍历有相同属性的值

    本篇文章将介绍如何使用PHP foreach遍历具有相同属性的值,并给出相应的代码示例。 一、基础概念 在讲解如何使用PHP foreach遍历有相同属性的值之前,我们需要先了解几…

    编程 2025-04-28
  • 在CentOS上安装Redis

    Redis是一款非关系型数据库,它支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等。Redis运行内存内并且支持数据持久化,它还可以应用于缓存、消息队列等场景。本文将介绍…

    编程 2025-04-28
  • 如何实现van-picker点击遮罩不关闭

    van-picker是一个非常实用的Vue组件,但默认情况下,点击遮罩会自动关闭选择器。本文将介绍如何通过代码实现van-picker点击遮罩不关闭的功能。 一、通过覆盖遮罩实现 …

    编程 2025-04-27

发表回复

登录后才能评论