SpringBoot监听redis键过期事件,实现订单超时关闭
场景
订单超时关闭,客户下单时未支付,超过一段时间会自动将订单修改为已关闭,不允许再次支付。类似的场景还有很多,只要用到有过期概念的都可以设计成该做法。
通常做法
- 通过定时任务每隔一段时间检查是否有超时订单,修改订单的状态,释放库存等等。
- 缺点:后台定时任务运行频繁,涉及订单操作业务比较复杂,增加服务器压力
思路
- 单机部署可以使用java8里面的DelayQueue延时队列,对超时的订单执行取消操作,同时缺点也存在,比如服务器宕机,那保存在内存的订单延时队列就被清空,对业务影响也比较大,建议和定时器结合使用。
- 使用redis存储过期键,当存储的键值过期时,发出事件通知,通知到程序,执行取消订单操作,不过同时也有宕机风险。因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 所以如果你的程序需要可靠事件通知(reliable notification of events), 那么目前的键空间通知可能并不适合你:当订阅事件的客户端断线时, 它会丢失所有在断线期间分发给它的事件。并不能确保消息送达。未来有计划允许更可靠的事件传递,但可能这将在更一般的层面上解决,或者为Pub / Sub本身带来可靠性,或者允许Lua脚本拦截Pub