redis过期key监听产生大量线程,导致内存溢出

**

redis过期key监听产生大量线程,导致内存溢出

**
1.打开源码在RedisHttpSessionConfiguration类中@Bean了RedisMessageListenerContainer对象.
同时也户注入bean的名称为springSessionRedisTaskExecutor的Executor taskExecutor
redis过期key监听产生大量线程,导致内存溢出
2.RedisMessageListenerContainer中判断如果Executor taskExecutor,为null,则注入默认的异步线程池,也即SimpleAsyncTaskExecutor. 而这个线程池是每次key过期都会开启一个新的线程,如果该异步方法存在阻塞的情况,过期的key又是大量的话,可能会导致JVM的内存溢出.
redis过期key监听产生大量线程,导致内存溢出
3.默认pringSessionRedisTaskExecutor线程池是没有注入的,所以使用的是默认线程池SimpleAsyncTaskExecutor.根据源码分析,如果想使用自定义的线程池,避免内存溢出的问题,则可以使用以下代码注入自定义线程池.
替换之前导入依赖

org.springframework.session
spring-session-data-redis

@Bean(name = “springSessionRedisTaskExecutor”)
public ThreadPoolTaskExecutor springSessionRedisTaskExecutor(){
ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(40);
executor.setKeepAliveSeconds(300);
executor.setQueueCapacity(50);
executor.setThreadNamePrefix("Spring session redis executor thread: ");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}