登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
每日签到
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
资源区
›
代码
›
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技 ...
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
[ 复制链接 ]
莠畅缕
2025-6-4 14:18:20
大家好,我是码农先森。
我们在某宝或某多多上抢购商品时,如果只是下了订单但没有进行实际的支付,那在订单页面会有一个支付倒计时,要是过了这个时间点那么订单便会自动取消。在这样的业务场景中,一般情况下就会使用到延时队列。
通常在客户下单之后,就会将订单数据推送到延时队列中并且会对该消息设置一个延时时长,比如设置五分钟、十分钟、或十五分钟等,具体的时长应该还是要结合当前的业务进行衡量,然后消费端会在指定时间到达后就对该消息进行支付支付状态判断,如果已经支付则不予处理,要还是未支付,则会取消该订单,并且释放商品库存。
我们这次分享的内容,主要是基于 Redis 延时队列的实现方式,当然除了 Redis 还可以用其他的技术,比如 RabbitMQ、Kafka、RocketMQ 等专业的消息队列。但是我用 Redis 的原因是,它的应用场景比较广泛,我们平时接触也比较多,而且相对于专业的消息队列它没有过多复杂的配置,学起来容易上手,出了问题解决起来也快,学东西的路径都是由易到难嘛。
另外,如果你对上面提到的专业消息队列使用很熟练,也可以将 Redis 更换成它们,这里只是存储介质的不同,技术的实现逻辑上没有太大区别,重要的是设计思想,大家各取所需吧。
好了,我先介绍一下这次延时队列的实现逻辑。主要分为三个部分,一是:消息的发送,如果设置了延时时间则会将消息存储到 Redis 的延时队列中,反之会直接将消息推送到 Redis 的就绪队列中等待消费。二是:将到期的消息从 Redis 延时队列中取出,并且推送到 Redis 的就绪队列中等待消费。三是:消费端会从 Redis 的就绪队列中按顺序读取出消息,并且执行对应的业务处理逻辑,如果处理失败则会将该消息,再次推送到 Redis 的延时队列中进行下一次的重试。
这里说到的延时队列是利用 Redis 有序集合来实现的,它每间隔一秒钟就会被轮询一次,如果有到期的消息,则就会将该消息推送到 Redis 就绪队列,并且从该集合中移除过期的消息,至此就可以等待着消费端进行消费了。接下来我们就从实际的代码出发,来看一下如何实现基于 Redis 的延时队列。
话不多说,开整!我们先来看一下整体的项目目录结构,内容主要分为 PHP 和 Go 两部分。
[manongsen@root php_to_go]$ tree -L 2
.
├── go_delay
│ ├── app
│ │ ├── controller
│ │ │ └── notify.go
│ │ ├── config
│ │ │ └── config.go
│ │ ├── extend
│ │ │ └── queue.go
│ │ └── route.go
│ ├── go.mod
│ ├── go.sum
│ └── main.go
└── php_delay
│ ├── app
│ │ ├── controller
│ │ │ └── Notify.php
│ ├── composer.json
│ ├── composer.lock
│ ├── command
│ │ └── Consumer.php
│ ├── route
│ │ └── app.php
│ ├── extend
│ │ └── Queue.php
│ ├── think
│ ├── vendor
│ └── .env
复制代码
ThinkPHP
使用 composer 创建基于 ThinkPHP 框架的 php_delay 项目。
## 当前目录
[manongsen@root ~]$ pwd
/home/manongsen/workspace/php_to_go/php_delay
## 安装 ThinkPHP 框架
[manongsen@root php_delay]$ composer create-project topthink/think php_delay
[manongsen@root php_delay]$ cp .example.env .env
## 安装 Composer 依赖包
[manongsen@root php_delay]$ composer require predis/predis
## 创建一个消费者脚本
[manongsen@root php_delay]$ php think make:command Consumer
## 创建一个生产者脚本,用于测试
[manongsen@root php_delay]$ php think make:command Producer
复制代码
这个就是延时队列实现的核心类,定义了就绪、延时、失败三个消息队列。send() 方法用于发送消息,其中可以指定 $delay 参数设置延时时间单位是秒。wait() 方法用于消费端监听消息,从下面的代码可以看出这里还利用多进程,父进程的作用是每间隔一秒钟,就从 Redis 有序集合中读取到期的消息,并将该消息推送到 Redis 就绪队列,子进程则阻塞监听就绪队列的消息,并且将接收到的消息回调到用户自定义的业务函数中。
[code]
PHP
Go
系列
ThinkPHP
Gin
相关帖子
软件设计模式系列之四——简单工厂模式
学信息系统项目管理师第4版系列24_整合管理
学信息系统项目管理师第4版系列22_进度管理
学信息系统项目管理师第4版系列12_合同管理
学信息系统项目管理师第4版系列03_文件与标准
学信息系统项目管理师第4版系列02_法律法规
学信息系统项目管理师第4版系列01_导读
学信息系统项目管理师第4版系列31_信息系统工程
学信息系统项目管理师第4版系列32_信息技术发展
学信息系统项目管理师第4版系列33_信息化发展
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
软件设计模式系列之四——简单工厂模式
0
959
愆蟠唉
2025-10-10
安全
学信息系统项目管理师第4版系列24_整合管理
0
544
咪四
2025-10-10
安全
学信息系统项目管理师第4版系列22_进度管理
0
550
艺轫
2025-10-10
安全
学信息系统项目管理师第4版系列12_合同管理
0
574
唯棉坜
2025-10-10
安全
学信息系统项目管理师第4版系列03_文件与标准
0
566
官厌
2025-10-10
安全
学信息系统项目管理师第4版系列02_法律法规
0
822
这帜
2025-10-10
安全
学信息系统项目管理师第4版系列01_导读
0
920
颛孙中
2025-10-10
安全
学信息系统项目管理师第4版系列31_信息系统工程
0
176
龙骋唧
2025-10-10
安全
学信息系统项目管理师第4版系列32_信息技术发展
0
7
麓吆
2025-10-10
安全
学信息系统项目管理师第4版系列33_信息化发展
0
781
汤流婉
2025-10-11
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
业界
签约作者
程序园优秀签约作者
发帖
莠畅缕
2025-6-4 14:18:20
关注
0
粉丝关注
26
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994888
dage888
999994
富账慕
10007
4
匝抽
9986
5
孙淼淼
9992
6
柴古香
9993
7
筒濂
9982
8
凌彦慧
9988
9
崔瑜然
9984
10
慢秤
9979
查看更多