基于redis实现延迟队列
1. 需求背景
产品经理给你提供以下需求:
- 超过10s未支付的订单,将会被取消
- 外卖商家超过5min未接单的订单,将会被取消
- 在平台注册但30day内未登录的用户,发短信提醒
- 首次充值后30min内未解约的用户,发送优惠卷
2. 理解需求
- 首先这是一个需求。
- 其次这是一个时间滞后的需求。
- 最后这是一个延迟队列需求。
3. 做需求
- 首先你知道了这是一个延迟队列需求
- 其次你知道了该用什么存储(redis+zset)
- 最后写代码完成它
4. 代码
- 消费延迟队列核心代码
- 生产核心要素就是利用redis提供的zset集合特性来做,至于为什么选择它,大家可以自行上网学习,时间会教会你一切!
- 生产消费队列核心代码
- 生产没有什么可说的,就是往里灌数据就行了!
5. 验证
往里塞3条数据,然后开启go func让其无限监听延迟队列。
6. 结果
首先看下延迟队列数据是否是三条
在看下是否是订单1先执行,其次是订单2,最后是订单3。
订单1:
订单2:
订单3:
再次看下延迟队列:发现延迟队列已经没有数据了,bingo!!!
7. 总结
延迟队列思想很简单,就是利用redis的zset再配合go func就可以实现。当然还有其他思路都可以去实现它,欢迎大家多多交流。