1.背景
项目上用户登陆token保存在redis中,如果redis的key过期后前端不会及时收到消息,只有在重新调用接口时才能获知已掉线然后重新登陆,
有时候已输入大量数据导致跳转登陆页面数据需要重新输入,因此提出登陆过期后直接弹出重新登陆提醒。
2.实现
2.1 配置文件开启key过期回调监听
修改redis.config, 去掉配置文件中 notify-keyspace-events Ex 注释
![在这里插入图片描述](https://img-blog.csdnimg.cn/ab0c64c3fdc24cd8b094a6a59a8edc3b.png)
2.2 增加配置类
RedisConfig
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory){
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
//首先解决key的序列化问题
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
//解决value的序列化问题
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
RedisKeyExpirationListener 监听类
@Component
@Slf4j
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 针对redis数据失效事件,进行数据处理
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
log.info(message.toString()+"已过期");
}
}
2.3 新建测试类
RedisController
@RestController
@RequestMapping("/redis")
@Slf4j
public class RedisController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/add")
public void addInfo(){
redisTemplate.opsForValue().set("user","123456789",10, TimeUnit.SECONDS);
log.info(redisTemplate.opsForValue().get("user")+"");
}
}
访问接口后测试效果