【问题标题】:How to isolate spring boot app redis and spring boot session global redis如何隔离spring boot app redis和spring boot session全局redis
【发布时间】:2018-06-06 12:33:52
【问题描述】:

据我所知,spring boot 和 spring session 为我们提供了一站式的自动配置,但是当我的应用程序使用 session redis 和 app cache redis 时,redis 服务器不一样; 怎么配置,非常感谢您的回复!

【问题讨论】:

    标签: spring-boot redis spring-session


    【解决方案1】:

    确实,默认情况下,spring-session 和 spring-cache 实际上都是由 spring-boot 配置的,带有一个名为 connectionFactoryRedisConnectionFactory bean。 有两种方法可以做到这一点。

    1. 使spring-session 使用不同的connectionFactory bean 实例,并让spring-cache 使用默认的connectionFactory。下面是一个示例解决方案:

      @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. 使spring-cache 使用不同的connectionFactory bean 实例,并让spring-session 使用默认的connectionFactory。下面是一个示例解决方案:

      @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;
          }
      }
      

    【讨论】:

      【解决方案2】:

      标记默认的 RedisConnectionFactory @Primary

          @Bean
          @Primary
          public RedisConnectionFactory redisConnectionFactory(RedisProperties properties) {
              return redisConnectionFactory(redisProperties);
          }
      

      并标记会话RedisConnectionFactory @SpringSessionRedisConnectionFactory

          @Bean
          @SpringSessionRedisConnectionFactory
          public RedisConnectionFactory springSessionRedisConnectionFactory() {
              return redisConnectionFactory(...);
          }
      

      redisConnectionFactory() 配置 RedisConnectionFactory。 例如:

      private static RedisConnectionFactory redisConnectionFactory(RedisProperties redisProperties, boolean afterPropertiesSet) {
              RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
              redisStandaloneConfiguration.setHostName(redisProperties.getHost());
              redisStandaloneConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
              redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase());
              redisStandaloneConfiguration.setPort(redisProperties.getPort());
      
              GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
              genericObjectPoolConfig.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle());
              genericObjectPoolConfig.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle());
              genericObjectPoolConfig.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive());
              genericObjectPoolConfig.setMaxWaitMillis(redisProperties.getLettuce().getPool().getMaxWait().toMillis());
              genericObjectPoolConfig.setTestOnBorrow(true);
              genericObjectPoolConfig.setTestOnReturn(true);
      
              LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration,
                      LettucePoolingClientConfiguration.builder().commandTimeout(redisProperties.getTimeout()).poolConfig(genericObjectPoolConfig).build());
              if (afterPropertiesSet) {
                  lettuceConnectionFactory.afterPropertiesSet();
              }
              return lettuceConnectionFactory;
          }
      

      【讨论】:

        猜你喜欢
        • 2021-12-10
        • 2021-07-18
        • 2015-04-18
        • 1970-01-01
        • 2015-04-19
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多