在工作中偶尔会遇到这样一个场景:用户下单之后,若30分钟内未完成支付,则取消订单。
做过电商业务的同学,尤其是做统一下单业务的同学一般都会接触过这个场景的需求,一般的处理方式是将订单数据存储到数据库中(MySQL之类的),然后由一个定时Job不断的去扫描符合条件的订单,修改订单状态为已取消。当然这只是其中一个处理办法,我们还可以使用到延时队列来处理。
那么如果我们使用Redis是否可以实现这一功能?我们知道在使用Redis的过程中,大多是由客户端主动的去操作服务端,比如set、del、get、expire等操作。而当一个key过期被删除的时候,由服务端主动的去通知客户端,这个要怎么做?
之前在一个项目中,是自己写了一个定时Job不断是去轮询要监听的某些key,然后如果发现Redis中不存在要get的key,则执行一段业务逻辑,我们的扫描频率取决于Job的执行频率,所以并不能保证key在过期时被立即监听到,如果n秒执行一次,则key最大可能会在2n-1秒之后被执行,会有一定的延迟,那么我们能否让Redis主动的在缓存失效的时候通知我们呢?
解析
由服务端主动通知客户端,那么就是需要通过一个事件来触发某项通知,事件通过Redis的订阅和发布功能来进行分发,我们查看Redis的配置文件中有一个EVENT NOTIFICATION配置,也名键空间通知