thinkphp6使用think-queue实现普通队列和延迟队列

Redis的延迟队列可以用于以下场景:
需求说明:

当用户申请售后,商家未在n小时内处理,系统自动进行退款。
商家拒绝后,用户可申请客服介入,客服x天内超时未处理,系统自动退款。
用户收到货物,x天自动确认收货
等等需要延时操作的流程……

1、秒杀业务

在秒杀业务中,常常需要对用户提交的订单进行实时处理,在高并发场景下,消息队列通常是必不可少的。而Redis的延迟队列可以很好地应对这种场景,将用户订单压入队列中,计算出订单的处理时间,并在指定的时间点推送到下单消息队列中,等待下一个处理流程。

2、任务调度

在许多场景下,需要定期执行一些任务,如对数据的扫描、发送邮件等。将这些任务放入Redis延迟队列中,根据任务执行时间的计算,等待相应时机推送到任务队列中,提高任务的执行效率与稳定性。

3、缓存更新

在应用缓存中,经常需要定期更新缓存。将缓存更新任务加入Redis延迟队列中,根据更新周期计算出下次更新时间,并在相应时机进行缓存更新,保证缓存数据的实时性。

四、Redis延迟队列最佳实践

在使用Redis延迟队列时,应注意以下几点:

1、数据结构的选择

在选择数据结构时,要根据具体场景进行选择。例如,若需要有序并快速查找,则使用Sorted Set更为合适;若仅需要简单的先进先出队列,则使用List即可。

2、消息处理的可靠性

在消息处理过程中,可能会遇到消息重复、消息消失等问题,因此应考虑如何保证消息的完整性与可靠性。可以采用ACK机制、简单重试机制、消息去重等策略来保证消息的可靠性。

3、定时器的精度

由于Redis的定时器粒度是毫秒级的,因此在时间计算时应注意舍入误差、时区处理等问题,避免计算出的时间点与实际时间不符合。

4、扫描策略的合理选择

 在扫描延迟队列时,需要注意扫描的频率对Redis的负载影响,应根据实际情况选择合理的扫描策略。

=============================================================

TP6 中使用 think-queue 可以实现普通队列和延迟队列。

think-queue 是thinkphp 官方提供的一个消息队列服务,它支持消息队列的一些基本特性:

消息的发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等队列的多队列, 内存限制 ,启动,停止,守护等消息队列可降级为同步执行

消息队列实现过程
1、通过生产者推送消息到消息队列服务中

2、消息队列服务将收到的消息存入redis队列中(zset)

3、消费者进行监听队列,当监听到队列有新的消息时,获取队列第一条

4、处理获取下来的消息调用业务类进行处理相关业务

5、业务处理后,需要从队列中删除消息

安装队列依赖

composer require topthink/think-queue

在这里插入图片描述
在项目下新建一个Job目录存放处理消息

在这里插入图片描述

use think\facade\Queue;public function job(Request $request){$params = $request->get();$jobHandlerClassName = 'app\job\Task'; $jobQueueName = 'task';$orderData = ['order_sn'=>$params['id']];//Queue::later();//立即执行$isPushed = Queue::later(10, $jobHandlerClassName, $orderData, $jobQueueName); //这儿的10是指10秒后执行队列任务if($isPushed !== false){echo '队列添加成功';}else{echo '插入失败了';}}

编写对应的消费者类 app\job/task.php

<?phpnamespace app\job;use think\queue\Job;class Task
{public function fire(Job $job, $data){$rt = $this->doJob($data);if($rt){$job->delete();return true;}// 重试三次失败 todo...if($job->attempts() == 3){$job->delete();return false;}//执行失败10S后重试$job->release(10);}public function doJob($data){echo date('Y-m-d H:i:s')."\n";return false;}}

php think queue:listen
–queue helloJobQueue \ //监听的队列的名称
–delay 0 \ //如果本次任务执行抛出异常且任务未被删除时,设置其下次执行前延迟多少秒,默认为0
–memory 128 \ //该进程允许使用的内存上限,以 M 为单位
–sleep 3 \ //如果队列中无任务,则多长时间后重新检查
–tries 0 \ //如果任务已经超过重发次数上限,则进入失败处理逻辑,默认为0
–timeout 60 // work 进程允许执行的最长时间,以秒为单位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8671.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分布式】zabbix 6.0部署讲解

目录 一、 序章二、zabbix概念2.1 zabbix是什么&#xff1f;2.2 zabbix 监控原理2.3 zabbix 6.0 新特性2.4 zabbix 6.0 功能组件 三、zabbix 6.0 部署部署服务端3.1 部署 Nginx PHP 环境并测试3.1.1 安装nginx3.1.2 安装php3.1.3 修改 Nginx 配置3.1.4 修改 php 配置3.1.5 创建…

windows下在注册表中添加右键pycharm打开目录

1、winregedit打开注册表&#xff0c;并在shell下创建项&#xff0c;修改如下图右侧内容 2、在PyCharm下创建command项&#xff0c;并修改其内容 3、重启电脑 4、显示

上半年结束,下半年继续冲!

前言: 这周直播也把雷神写的Ffmpeg推流器讲解完了&#xff0c;而一同时&#xff0c;一转眼间&#xff0c;2023年已经过半&#xff0c;正式进入了下半年&#xff1a; 因为上半年已经开始在做解析Ffmpeg 最新版本的源码&#xff0c;所以下半年&#xff0c;我会继续坚持讲解Ffmpeg…

【NoSQL之 Redis配置】

目录 一、关系数据库与非关系型数据库1、关系型数据库和非关系型数据库区别&#xff08;1&#xff09;数据存储方式不同&#xff08;2&#xff09;扩展方式不同&#xff08;3&#xff09;对事务性的支持不同 2、非关系型数据库产生背景总结 二、Redis简介1、Redis 具有以下几个…

Redis常见面试题

什么是Redis持久化&#xff1f;Redis有哪几种持久化方式&#xff1f;优缺点是什么 把redis内存中的数据持久化到磁盘的过程就是redis持久化。RDB:快照存储&#xff0c;每隔一段时间对redis内存中的数据进程快照存储。优点:恢复数据快 缺点:数据完整性差 AOF:日志追加 把每个写…

Cyclo(-D-Ser-Pro-D-Val-Leu-D-Trp),153982-38-8,水溶性二肽,具有明显的生理活性

Cyclo(-D-Ser-Pro-D-Val-Leu-D-Trp)| CAS&#xff1a;153982-38-8 | 纯度&#xff1a;95%结构式&#xff1a; ​ 试剂参数信息&#xff1a; CAS&#xff1a;153982-38-8 外观&#xff08;Appearance&#xff09;&#xff1a;固体/粉末 分子式&#xff08;Molecular Formul…

在Ubuntu环境下安装anaconda(很简单!!!!!)

前言&#xff1a;想要使用tensorflow-compression,但是这个在windows下不支持。那我只好去Ubuntu环境下的安装anaconda。但是&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;找了半天&#xff0c;都没找到好的安装教程&#xff0c;浪费了一下午&#xff0c;心态…

陌陌聊天数据分析 (一)

陌陌聊天数据分析&#xff08;一&#xff09; 目标 基于Hadoop和Hive实现聊天数据统计分析&#xff0c;构建聊天数据分析报表 需求 统计今日总消息量统计今日每小时消息量&#xff0c;发送和接收用户数量统计今日各地区发送消息数据量统计今日发送消息和接收消息用户数统计…

处理 Windows Server 中 CVE-2016-2183(SSL/TLS) 漏洞的方法

一、漏洞说明 Windows server 2008或2012远程桌面服务SSL加密默认是开启的&#xff0c;且有默认的CA证书。由于SSL/ TLS自身存在漏洞缺陷&#xff0c;当开启远程桌面服务&#xff0c;使用漏洞扫描工具扫描&#xff0c;发现存在SSL/TSL漏洞。 例如如下漏洞&#xff1a; 二、…

TiDB 升级利器(参数对比)——TiDBA

作者&#xff1a; 啦啦啦啦啦 原文来源&#xff1a; https://tidb.net/blog/299f0bdc 一.背景 针对 LTS 版本&#xff0c;PingCAP 会提供最多至 3 年时间的常规版本更新&#xff0c;以解决版本运行过程中遇到的问题&#xff0c;以及安全相关的漏洞修复。而对于已经结束维护…

7DGroup性能实施项目日记9

好多天没写实施日记了&#xff0c;这段时间&#xff0c;我也有些其他事情要做&#xff0c;因为前阵子答应了写些东西&#xff0c;所以这几天晚上弄到两三点&#xff0c;终于写完了五万字的东西交了差。 这一段时间是培训的课程关键内容&#xff0c;基本都是分析的关键环节。主…

Intellij IDEA 插件开发 | 京东云技术团队

写在前面 很多idea插件文档更多的是介绍如何创建一个简单的idea插件&#xff0c;本篇文章从开发环境、demo、生态组件、添加依赖包、源码解读、网络请求、渲染数据、页面交互等方面介绍&#xff0c;是一篇能够满足基本的插件开发工程要求的文章。 如有疏漏欢迎指正&#xff0…