订单用户超时支付,订单状态改为已超时
在开发中,往往会遇到一些关于延时任务的需求,例如订单超时
解决方案:
- 数据库轮询(quartz可以实现,耗性能)
- JDK的延迟队列(DelayQueue,效率高,任务触发时间延迟低,怕宕机)
- 时间轮算法(Netty的HashedWheelTimer来实现)
- redis缓存
- 使用消息队列(运维成本较高)
- redis键空间失效通知
案例:redis键空间失效通知
修改redis的redis.conf文件
找到 notify-keyspace-events Ex 这一行 取消行前边的注释 开启键空间失效通知
新键配置类
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
新建监听器 并继承自 KeyExpirationEventMessageListener
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();//获取失效的key
if (expiredKey.startsWith("order:")) {
// 获取订单orderNO
String orderNo = expiredKey.substring(expiredKey.lastIndexOf(":")+1);
// 支付的订单改为已取消(超时未支付),业务处理
System.out.println(orderNo);
}
}