@Configuration public class RedisListenerConfig { @Autowired @Qualifier("springSessionRedisTaskExecutor") ThreadPoolTaskExecutor threadPoolTaskExecutor; @Bean(name = "redisMessageListenerContainer") RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setTaskExecutor(threadPoolTaskExecutor); // 事件以__keyevent@<db>__为前缀进行发布 // container.addMessageListener(new RedisKeyExpirationListener(container), new PatternTopic("__keyevent@0__" + // ":expired")); return container; }
@Bean(name = "springSessionRedisTaskExecutor") public ThreadPoolTaskExecutor springSessionRedisTaskExecutor(){ ThreadPoolTaskExecutor springSessionRedisTaskExecutor = new ThreadPoolTaskExecutor(); springSessionRedisTaskExecutor.setCorePoolSize(10); springSessionRedisTaskExecutor.setMaxPoolSize(16); springSessionRedisTaskExecutor.setKeepAliveSeconds(10); springSessionRedisTaskExecutor.setQueueCapacity(1000); springSessionRedisTaskExecutor.setThreadNamePrefix("Spring session redis executor thread: "); return springSessionRedisTaskExecutor; }
}
@Slf4j @Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(@Qualifier("redisMessageListenerContainer") RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Override public void onMessage(Message message, byte[] pattern) { // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key String expiredKey = message.toString(); log.info("过期key:{}",expiredKey); if (expiredKey.startsWith(RedisConstant.AUTO_CALL_TIMER_KEY)){ } } }