利用redis过期机制实现订单超时功能
以前记录过使用 RabbitMQ 的死信队列 实现订单超时的功能,但实现的还是比较复杂,还要安装RabbitMQ,使用线程记录又太占用服务器资源,这里记录一下如何使用Redis来实现超时功能
解决方案
利用redis中key自动过期的机制,在订单提交的时候设置过期时间并写入redis
并监听获取过期key,通过key值判断是否为订单的key值并修改订单状态
代码
添加到redis的代码暂时先不写了,格式 key值格式为 order:订单号 或者 order:订单主键就好了
监听redis过期事件
/**
* redis配置
*/
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
/**
* 监听redis过期事件
*/
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 针对redis数据失效事件,进行数据处理
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
try {
String key = message.toString();
//从失效key中筛选代表订单失效的key
System.out.println(key);
if (key != null && key.startsWith("order:")) {
String orderNo = key.substring(6);
log.info("订单超时,订单号为: " + orderNo);
}
} catch (Exception e) {
e.printStackTrace();
log.error("修改支付订单过期状态异常: " + e.getMessage());
}
}
}
这个就是简单的订单超时功能的实现
利用redis过期机制实现订单超时功能
https://guiyunweb.com/archives/%E5%88%A9%E7%94%A8redis%E8%BF%87%E6%9C%9F%E7%9A%84%E6%9C%BA%E5%88%B6%E5%AE%9E%E7%8E%B0%E8%AE%A2%E5%8D%95%E8%B6%85%E6%97%B6%E5%8A%9F%E8%83%BD