【问题标题】:Spring Data Redis multiple instancesSpring Data Redis 多实例
【发布时间】:2015-03-16 22:11:42
【问题描述】:

我有 2 个 Redis Server redis1 和 redis2 实例。 我正在尝试使用 Spring Data Redis 支持从 redis1 获取数据并将数据保存到 redis2,但它不起作用。我的代码:

//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);
    }
}

当我使用 getUsernameFromRedis() 方法时,使用的 redis 主机是“host1”而不是“host2”:-( 问题出在哪里?

【问题讨论】:

    标签: spring redis spring-data


    【解决方案1】:

    由于它是单个应用程序,因此您必须拥有唯一的 bean names 才能将它们全部填充到单个 ApplicationContext。否则上下文启动后只存在一个同名bean。

    默认情况下,@Bean 填充方法中的名称。这就是为什么你看到的是host1,而不是host2

    所以,或者为这些 bean 方法提供唯一的名称,或者使用 @Bean(name = ) 属性。

    【讨论】:

    • 我尝试通过为所有这些 @Beans 添加唯一名称来尝试此操作,但随后 Spring 抛出无法找到名称为 jedisConnectionFactory() 的 @Bean 的异常
    • 其中一个人只需jedisConnectionFactory()就可以生活
    • 我也尝试了这个解决方案,但它产生了错误:org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.data.redis.connection.RedisConnectionFactory] ​​is defined: expected单个匹配 bean 但找到 2:oldJedisConnectionFactory,jedisConnectionFactory
    • 在这种情况下,您必须在任何地方的private RedisConnectionFactory redisConnectionFactory 字段中使用@Qualifier("jedisConnectionFactory")@Autowired
    • 如果我使用这个:@Qualifier("redisTemplate") private RedisTemplate&lt;String, String&gt; redisTemplate; @Qualifier("oldRedisTemplate") private RedisTemplate&lt;String, String&gt; oldRedisTemplate; 我有同样的错误:没有定义类型 [org.springframework.data.redis.connection.RedisConnectionFactory] ​​的限定 bean:预期的单个匹配 bean 但找到2: oldJedisConnectionFactory,jedisConnectionFactory
    【解决方案2】:

    @自动连线 私有 RedisAConfig redisAConfig;

    @自动连线 私有 RedisAConfig redisBConfig;

    应该是 RedisBConfig。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 2022-10-05
      • 1970-01-01
      • 2012-06-24
      • 2018-06-15
      • 2020-11-07
      • 2016-03-18
      • 1970-01-01
      相关资源
      最近更新 更多