首页 > 运维 > linux运维 > 正文

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

看不見的法師
发布: 2025-07-15 10:08:02
原创
656人浏览过

背景

我们平时开发可能要求实现这样的需求:用户可以在有效的时间内进行商品竞拍,当有效时间过了之后,取竞拍价最高的用户成交。我们一般可以使用定时任务每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)

绘蛙AI商品图
绘蛙AI商品图

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

绘蛙AI商品图 80
查看详情 绘蛙AI商品图

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以上就是我使用延迟队列实现商品的竞拍成交功能的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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