一、redis开启过期键通知
找到redis配置文件redis.conf,打开配置文件找到
notify-keyspace-events 配置查看是否开启,默认是没有开启的,去掉前面的#
notify-keyspace-events Ex
二、RedisListenerConfig 实现监听 Redis key 过期时间
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
三、继承redis键过期监听器,进行业务处理
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Autowired
private OrderService orderService;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
//可获取失效的key
String expiredKey = message.toString();
log.info("redis key 失效; key = {}", expiredKey);
1. 使用String类的startsWith
if (expiredKey.startsWith("order")) {
// 获取订单orderNo
String orderNo = expiredKey.substring(expiredKey.lastIndexOf(":") + 1);
// 将待支付的订单改为已取消(超时未支付)
orderService.orderPaidTimeout(orderNo);
}
2. 判断或者用hutool工具类
if (StrUtil.startWith("", "order")) {
}
}
}