Search code examples
spring-bootredisspring-session

How to isolate spring boot app redis and spring boot session global redis


As I know, spring boot and spring session provided us one-stop autoconfig, but when my app use session redis and app cache redis not same redis server; How can I config it, thank you very much for your reply!


Solution

  • Indeed, by default, both spring-session and spring-cache are actually configured by spring-boot with a RedisConnectionFactory bean named as connectionFactory. Two ways to do this.

    1. make spring-session to use a different connectionFactory bean instance, and leave spring-cache to use the default connectionFactory. And below is a sample solution:

      @Configuration
      public class RedisHttpSessionConfig {
      
          @Bean
          StringRedisSerializer stringRedisSerializer() {
              return new StringRedisSerializer();
          }
      
          @Bean
          RedisConnectionFactory redisHttpSessionConnectionFactory() {
              RedisConnectionFactory redisHttpSessionConnectionFactory = null;
              // ... add your codes here
              return redisHttpSessionConnectionFactory;
          }
      
          @Bean
          public RedisTemplate<Object, Object> sessionRedisTemplate(
                  RedisConnectionFactory redisHttpSessionConnectionFactory) {
              RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
              template.setKeySerializer(new StringRedisSerializer());
              template.setHashKeySerializer(new StringRedisSerializer());
              template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
              template.setDefaultSerializer(GenericJackson2JsonRedisSerializer());
              template.setConnectionFactory(redisHttpSessionConnectionFactory);
              return template;
          }
      }
      
    2. make spring-cache to use a different connectionFactory bean instance, and leave spring-session to use the default connectionFactory. And below is a sample solution:

      @Configuration
      public class RedisCacheConfig {
      
          @Bean
          StringRedisSerializer stringRedisSerializer() {
              return new StringRedisSerializer();
          }
      
          @Bean
          RedisConnectionFactory redisCacheConnectionFactory() {
               RedisConnectionFactory redisCacheConnectionFactory = null;
               // ... add your codes here
               return redisCacheConnectionFactory;
          }
      
          @Bean
          RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisCacheConnectionFactory) {
              RedisTemplate<Object, Object> redisTemplate = new RedisTemplate();
              redisTemplate.setConnectionFactory(redisCacheConnectionFactory);
              redisTemplate.setKeySerializer(this.stringRedisSerializer());
              redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
              return redisTemplate;
          }
      
          @Bean(name = "stringRedisTemplate")
          public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisCacheConnectionFactory) throws UnknownHostException {
              StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
              stringRedisTemplate.setConnectionFactory(redisCacheConnectionFactory);
              stringRedisTemplate.setKeySerializer(this.stringRedisSerializer());
              stringRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
              return stringRedisTemplate;
          }
      
          @Bean
          CacheManager cacheManager(RedisTemplate redisTemplate) {
              RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
              cacheManager.setDefaultExpiration(600l);
              cacheManager.setUsePrefix(true);
              return cacheManager;
          }
      }