业务系统设计中,常有订单自动关闭的功能,下单后指定时间内没有支付则自动关闭订单。这里介绍一种利用redis键失效通知实现订单自动关闭的方法
redis键失效策略原理
blog.csdn.net/zhu_tianwei/article/details/80169900
实现步骤
- 在创建订单时,用订单Id+前缀组成key,存储到redis中,并设置过期时间
public void setEx(String key, String value, long timeout, TimeUnit unit) {
this.stringRedisTemplate.opsForValue().set(key, value, timeout, unit);
}
- 在应用中新建listener继承KeyExpirationEventMessageListener,并且重写onMessage方法
@Override
public void onMessage(Message message, byte[] pattern) {}
其中message即为失效key的名称,去掉前缀后取出订单Id,做关闭订单处理
需要注意的一点是,在多个应用部署的情况下,每个客户端都会收到channel发布的失效事件,所以需要在业务处理时使用锁锁住该订单
public boolean tryLock(String key, String value, int expireTime) throws Exception {
return this.stringRedisTemplate.opsForValue().setIfAbsent(key, value, (long)expireTime, TimeUnit.MILLISECONDS);
}