修改redis.config
notify-keyspace-events Ex
设置redis相关配置
@ConditionOnRedisCache
@Configuration(proxyBeanMethods = false)
public class RedisConfigure {
@Bean
@ConditionalOnClass(RedisOperations.class)
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用 String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的 key也采用 String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用 jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的 value序列化方式采用 jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
//开启事务
template.setEnableTransactionSupport(true);
return template;
}
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//指定监听库
container.addMessageListener(new MonitorRedisOverdue(),new PatternTopic("__keyevent@10__:expired"));
return container;
}
}
redis监听器
@Slf4j
public class MonitorRedisOverdue implements MessageListener {
private RedisService redisService;
priavet static final String set_nx = "set_nx";
private void initBean() {
redisService = AppContextHolder
.getBean(RedisService.class);
}
@Override
public void onMessage(Message message, byte[] pattern) {
try {
//解决Bean注入失败问题
initBean();
//获取的key
Boolean aBoolean = false;
String expiredKey = message.toString()
if(!key.contains(set_nx)){
aBoolean = redisService.setIfAbsent(set_nx.concat(expiredKey), String.valueOf(System.currentTimeMillis()), 30, TimeUnit.SECONDS);
}
if(aBoolean){
//业务操作。。。
}
} catch (Exception e) {
log.error("监听redis过期key出现异常!,{}", e.getMessage());
}
}
}
解决在监听器中,不能使用@Autowired(在class上加入@Service也不可以)
@Component
public class AppContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
AppContextHolder.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
}