此文章主要是之前一篇文章的拓展,上一篇文章说到,订单超时有三种处理方法,这篇文章记录的就是第二种解决方法
上一篇文章地址
下面开始实际操作
-
修改redis相关事件配置,添加 notify-keyspace-events Ex
- 直接修改redis.conf文件
- 或者使用RedisDesktopManager远程连接工具open console按钮,使用命令行
CONFIG SET notify-keyspace-events Ex
解决 但是两种方法设置完后都必须要重启redis服务,否则不会生效
-
加入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<scope>compile</scope>
<version>2.9.7</version>
</dependency>
- 定义配置RedisListenerConfig
@Configuration
public class RedisListenerConfig {
@Autowired
private RedisTemplate redisTemplate;
/**
* 处理乱码
* @return
*/
@Bean
public RedisTemplate redisTemplateInit() {
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
//val实例化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
- 定义监听器,实现KeyExpirationEventMessageListener接口
@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) {
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
String expiredKey = message.toString();
if(expiredKey.startsWith("test:")){
//如果是test:开头的key,进行处理
System.out.println(expiredKey);
String substring = expiredKey.split(":")[1]; //去掉orderNo
System.out.println("------!!!!" + substring + "!!!-----");
}
}
}
- 测试是否起作用
public class Test(){
    @Resource
    private RedisTemplate redisTemplate;
    redisTemplate.opsForValue().set("test:123","dadada" ,25, TimeUnit.SECONDS );
}
打开debug调试,发现30s后,能进行回调
输出结果如下,证明回调成功,该方法真实可行