0

0

我使用延迟队列实现商品的竞拍成交功能

看不見的法師

看不見的法師

发布时间:2025-07-15 10:08:02

|

664人浏览过

|

来源于php中文网

原创

背景

我们平时开发可能要求实现这样的需求:用户可以在有效的时间内进行商品竞拍,当有效时间过了之后,取竞拍价最高的用户成交。我们一般可以使用定时任务每5s定时扫描数据库,获取有效时间大于当前时间的商品列表,然后取每个商品中竞价最高的用户存入商品成交表中。

我使用延迟队列实现商品的竞拍成交功能

商品成交

如果使用定时任务,这里会有一个问题,定时任务每5s执行一次,就会查询一次数据库,这样对系统,对数据库压力会有一定的压力,并且时间精确度不是很高。个人觉得不是最好的方法。

对于上面的需求,我决定使用延迟对列实现。实现的逻辑为:

当系统启动时,扫描已经发布的商品,并将商品id存放入Redis的延迟队列如果有新商品发布,将新商品id存入延迟队列启动一个常驻线程,扫描延迟队列,获取已到竞拍时间结束的商品,并获取对应商品的竞拍信息,存入用户商品成交表中使用一个兜底的定时任务,每晚执行一次步骤1
我使用延迟队列实现商品的竞拍成交功能

延迟队列

这样我们将原来数据库的压力转移到了Redis上,并且Redis本身的Zset也可实现延迟队列,性能会更好。

关于RedisZset实现延迟队列,有兴趣的同学可以看看我写的这篇文章:

代码实现

我们先来写一个Redis工具RedisDelayingQueue<t></t>,用于将数据放入Zset中。

我使用延迟队列实现商品的竞拍成交功能

上面代码中queueKeyRediskeymsgkey对应的值,endDate为结束时间,即消费的时间。我们将msg信息封装成TaskItem对象,以便存取。

我使用延迟队列实现商品的竞拍成交功能

TaskItem的id可以使用id生成器生成唯一id。

将数据存入Redis后。我们需要延迟消费它。

我使用延迟队列实现商品的竞拍成交功能

上面代码是将指定score的数据从Redis中取出,即当前时间小于Redis存入的时间时,我们将这个数据传给handleMsg方法执行。

handleMsg方法具体如下:

我使用延迟队列实现商品的竞拍成交功能

这里每一个queueKey对应一个消费类,map中存入的是queueKey和对应的消费类。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">Map<String, DelayHandler> map = Maps.newHashMap();</code>

当实例化RedisDelayingQueue时,实例化DelayHandler所有的实现类。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">public RedisDelayingQueue(List<DelayHandler> delayHandlers) {    delayHandlers.forEach(delayHandler -> map.put(delayHandler.getQueueKey(), delayHandler));}</code>

所以当我们执行map.get(queueKey)时,获取到的就是queueKey和对应的消费类。因此消费后的业务代码,我们只需要写一个类实现DelayHandler,并重写handler(msg)

商易多用户商城
商易多用户商城

功能介绍:1. 商品出售包含拍卖模式,一口价模式。2. 全套系统采用淘宝网风格,成熟,简洁大方3. 每个商品支持多张图片上传,可自由设定,满足广大网民的迫切要求4. 商品信息支持 ubb,图文并茂5. 注册用户可参与竞拍,或者拍卖自己的商品6. 拥有会员注册,交易提醒,成交商品确认等邮件发送功能7. 拥有交易双方信用评价的功能,使得交易安全可*,可信度高8. 拥有安全稳定的用户虚拟币平台,可实现商

下载

这里我们重写一个商品消费类。

我使用延迟队列实现商品的竞拍成交功能

接下来我们就是将业务中的数据塞入Redis中。

我使用延迟队列实现商品的竞拍成交功能

这里我们使用异步的方式将数据推入Redis中,将符合条件的数据消费出来。

我使用延迟队列实现商品的竞拍成交功能

启动系统时需要执行delayxxxDealResult方法用于向Redis中推送数据。

如果我们需要新发布商品时,也需要向Redis中推送数据。

我使用延迟队列实现商品的竞拍成交功能

当然如果你不放心,还可以用定时任务每天执行一次数据的推送。

我使用延迟队列实现商品的竞拍成交功能

为了保证我们消费的数据不重复,在将消费的数据入库时需要做一下去重判断哦。

测试
我使用延迟队列实现商品的竞拍成交功能

如上图,我们将其中一个商品竞拍结束时间设置为比当前时间大,另一个商品为比当前时间小。启动系统控制台打印了如下日志:

我使用延迟队列实现商品的竞拍成交功能

状态为DOING的商品为竞拍中的商品,因此都进入了延迟队列。

我使用延迟队列实现商品的竞拍成交功能

启动系统后我们发现结束时间小于当前时间的商品已经被消费,因为没有人竞拍,而竞拍时间到了,这里显示为流拍UNSETTLE。

时间一到,延迟队列准时消费满足条件的数据。

我使用延迟队列实现商品的竞拍成交功能
我使用延迟队列实现商品的竞拍成交功能

看数据库中商品的状态也改变了。

交易结果也插入了相关的商品信息。

我使用延迟队列实现商品的竞拍成交功能

到这里我们就实现了商品竞拍成交功能。

如果你有更好的想法,欢迎评论给出意见。如果这篇文章对你有帮助,欢迎点赞转发。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

763

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

47

2025.11.27

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1004

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

669

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

501

2024.04.02

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.3万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号