【问题标题】:Using different Redis databases for Spring sessions and custom data为 Spring 会话和自定义数据使用不同的 Redis 数据库
【发布时间】:2018-08-21 19:23:27
【问题描述】:

在我的 REST 控制器 Spring 项目中,我想将 Session 信息存储在 Redis 中,并将我的自定义信息(我需要的任何内容)也存储在 Redis 中,但是在一个单独的数据库中。

在我的 application.properties 我定义了以下内容:

spring.session.store-type=redis
spring.session.redis.namespace=rdrestcore
spring.redis.host=192.168.201.46
spring.redis.port=6379
spring.redis.database=5

com.xyz.redis.host=192.168.201.46
com.xyz.redis.db=0
com.xyz.redis.port=6379
com.xyz.redis.pool.min-idle=5

我还有一个包含以下代码的类(我在某处读到我需要这个类只是为了让 Spring 管理 Redis 中的会话......如您所见,它没有代码):

@Configuration
@EnableRedisHttpSession 
public class SessionConfig extends AbstractHttpSessionApplicationInitializer 
{}

我终于有了这样的redis连接工厂:

@Configuration
@EnableRedisRepositories
public class RdRedisConnectionFactory {
    @Autowired 
    private Environment env;
    @Value("${com.xyz.redis.host}")
    private String redisHost;
    @Value("${com.xyz.redis.db}")
    private Integer redisDb;
    @Value("${com.xyz.redis.port}")
    private Integer redisPort;
    @Value("${com.xyz.redis.pool.min-idle}")
    private Integer redisPoolMinIdle;

    @Bean
    JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();        
        if(redisPoolMinIdle!=null) poolConfig.setMinIdle(redisPoolMinIdle);

        return poolConfig;
    }

    @Bean    
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
        if(redisHost!=null) jedisConFactory.setHostName(redisHost);
        if(redisPort!=null) jedisConFactory.setPort(redisPort);
        if(redisDb!=null) jedisConFactory.setDatabase(redisDb);
        jedisConFactory.setPoolConfig(jedisPoolConfig());
        return jedisConFactory;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate< String, Object > template =  new RedisTemplate();
        template.setConnectionFactory( jedisConnectionFactory() );
        template.setKeySerializer( new StringRedisSerializer() );
        template.setHashValueSerializer( new StringRedisSerializer() );
        template.setValueSerializer( new StringRedisSerializer() );
        return template;
    }
}

当我需要读取或写入 Redis 时,我只需在需要的地方自动连接 redisTemplate 即可。

现在...问题:Spring 会话信息与我的自定义信息存储在同一个数据库中,尽管我为会话信息指定了数据库 5,为我的自定义信息指定了数据库 0。一切都进入数据库 0。

有谁知道我做错了什么?

谢谢

【问题讨论】:

    标签: java spring session redis


    【解决方案1】:

    对可能重复的 bean 使用不同的 bean id 是个好主意。

    @Bean    
    JedisConnectionFactory jedisConnectionFactory() {...connection}
    

    上面的函数定义了一个bean,并给了它一个默认id:jedisConnectionFactory,这可能会取代你认为spring用来构造StringRedisTemplate(由spring.redis.xxx配置),它也寻找一个bean具有相同 bean id 的 JedisConnectionFactory 类。结果是它们都使用{...connection} 中的定义。

    顺便说一句:这无关紧要,但我注意到您通过注释 @Bean 定义了自己的 bean,但您没有以更正确的方式使用它:

    @Bean(name="myJedisPool")
    JedisPoolConfig jedisPoolConfig() {
    }
    
    JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {        
        // use spring managed bean.
        jedisConFactory.setPoolConfig(jedisPoolConfig);
    }
    
    @Bean(name="myRedisTemplate")
    public RedisTemplate<String, Object> redisTemplate(@Qualifier("myJedisPool") JedisPoolConfig jedisPoolConfig) {
       // use spring managed bean.
        template.setConnectionFactory( jedisConnectionFactory(jedisPoolConfig) );
    }
    

    或者你发现有这么多豆子没用,所以你像这样减少豆子的数量:

    // not a bean
    JedisPoolConfig getJedisPoolConfig() {
    }
    
    // not a bean  
    JedisConnectionFactory getJedisConnectionFactory() {        
        jedisConFactory.setPoolConfig(getJedisPoolConfig());
    }
    
    // only this is bean, because consumers are expecting this.
    @Bean(name="myRedisTemplate")
    public RedisTemplate<String, Object> redisTemplate() {
        template.setConnectionFactory( getJedisConnectionFactory() );
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2012-08-14
      • 1970-01-01
      • 2017-05-17
      相关资源
      最近更新 更多