Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Data Redis multiple instances

I have 2 instances of Redis Server redis1 and redis2. I'm trying get Data form redis1 and save data to redis2 with Spring Data Redis support but it's not working. My code:

//class a
@Configuration
public class RedisAConfig {
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName("host1");
        return jedisConnectionFactory;
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());

        return redisTemplate;
    }
}

//class b
@Configuration
public class RedisBConfig {
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName("host2");
        return jedisConnectionFactory;
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());

        return redisTemplate;
    }
}

//use class
@EnableConfigurationProperties({RedisAConfig.class, RedisBConfig.class})
public class Receiver {

    @Autowired
    private RedisAConfig redisAConfig;

    @Autowired
    private RedisAConfig redisBConfig;

    private String getUsernameFromRedis(String userIp) {

        return redisBConfig.redisTemplate().opsForValue()..get(userIp);
    }

    private void saveThreatsToRedis(String userIp, List<Log> threats)    {
        JSONSerializer serializer = new JSONSerializer();
        String json = serializer.serialize(threats);
        String key = "TH:" + userIp;
        redisAConfig.redisTemplate().opsForValue().set(key, json);
    }
}

When I'm using method getUsernameFromRedis() the host for redis which is used is "host1" not "host2" :-( Where is the problem?

like image 301
tomcyr Avatar asked May 08 '26 01:05

tomcyr


1 Answers

Since it is a single application, you have to have unique bean names to populate them all to single ApplicationContext. Otherwise only one bean with the same name exists after context startup.

By default @Bean populates with the name from the method. That's why you see host1, not host2.

So, or provide unique names for those bean methods, or use @Bean(name = ) attribute.

like image 106
Artem Bilan Avatar answered May 09 '26 14:05

Artem Bilan