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

2022-05-05 19:31:16 浏览数 (1)

背景

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

商品成交

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

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

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

延迟队列

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

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

0 人点赞