前言
最近项目区分了不同的订单类型,要求订单的失效时间不一样,比如活动订单的失效时间要短一些。由于之前订单的失效时间都是固定的,现在有些类型的订单过期时间发生变化。因此需要重新处理时效订单。
订单失效解决方案:
常用方法
一个定时任务,轮训没支付的订单,比较下单时间和当前时间,如果过期还没支付,就取消订单。
问题: 每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔,设置得过短,查询太频繁,影响效率。
新方案
在生成订单时,将订单号放入Redis中,设置对应的过期时间。如果订单过期后能够发送给程序一个通知,或者执行一个方法,那么即可解决订单关闭问题。
原理:通过监听 Redis 提供的过期队列来实现,监听过期队列后,如果 Redis 中某一个 KV 键值对过期了,那么将向监听者发送消息,监听者可以获取到该键值对的 K,拿到 K 后,通过 K 定位订单,并判断其状态,如果是未支付,更新为关闭,或者取消状态即可。
实战
1 修改redis.conf 默认的配置:notify-keyspace-events ""
、 为:notify-keyspace-events Ex
2 reidis 监听配置
测试
1 设置订单过期时间
2
总结
此种方法利用Redis事件监听能准确地处理时效订单。
致谢
感谢看文章的小伙伴,如果有疑问欢迎交流,如果能加下关注就更好了,你们的关注是我持续更新的动力,让我们用好工具,减少打工人的工作时间,有更多的时间陪伴家人和思考这个世界。