背景
我们平时开发可能要求实现这样的需求:用户可以在有效的时间内进行商品竞拍,当有效时间过了之后,取竞拍价最高的用户成交。我们一般可以使用定时任务每5s定时扫描数据库,获取有效时间大于当前时间的商品列表,然后取每个商品中竞价最高的用户存入商品成交表中。
商品成交
如果使用定时任务,这里会有一个问题,定时任务每5s
执行一次,就会查询一次数据库,这样对系统,对数据库压力会有一定的压力,并且时间精确度不是很高。个人觉得不是最好的方法。
对于上面的需求,我决定使用延迟对列实现。实现的逻辑为:
- 当系统启动时,扫描已经发布的商品,并将商品id存放入
Redis
的延迟队列 - 如果有新商品发布,将新商品id存入延迟队列
- 启动一个常驻线程,扫描延迟队列,获取已到竞拍时间结束的商品,并获取对应商品的竞拍信息,存入用户商品成交表中
- 使用一个兜底的定时任务,每晚执行一次步骤1
延迟队列
这样我们将原来数据库的压力转移到了Redis
上,并且Redis
本身的Zset
也可实现延迟队列,性能会更好。
关于Redis
的Zset
实现延迟队列,有兴趣的同学可以看看我写的这篇文章:
“