Как создать второй экземпляр RedisTemplate в приложении Spring Boot

Согласно этому ответу, один RedisTemplate не может поддерживать несколько сериализаторов для значений. Поэтому я хочу создать несколько RedisTemplates для разных нужд, в частности, один для строковых действий и один для сериализации объектов в JSON, которые будут использоваться в RedisCacheManager. Я использую Spring Boot, и текущий RedisTemplate подключается автоматически, мне интересно, как правильно объявить второй экземпляр RedisTemplate, использующий ту же фабрику соединений Jedis, но имеющий свои собственные сериализаторы?

Пробовал что-то подобное в двух разных компонентах,

Компонент 1 объявляет,

    @Autowired
    private RedisTemplate redisTemplate;

    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Instance.class));

Компонент 2 объявляет,

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

В этом случае два шаблона на самом деле одинаковы. Проследил код Spring и обнаружил, что шаблон компонента 1 был преобразован в автоматически сконфигурированный stringRedisTemplate.

Ручной вызов конструктора RedisTemplate, а затем его afterPropertiesSet() тоже не будет работать, так как он жалуется, что невозможно найти фабрику соединений.

Я знаю, что этот запрос, вероятно, не сильно отличается от определения другого bean-компонента в приложении Spring, но не уверен, что с текущей интеграцией Spring-Data-Redis мне лучше всего это сделать. Пожалуйста, помогите, спасибо.


person Derek    schedule 20.02.2016    source источник


Ответы (1)


вы можете использовать два способа использования нескольких RedisTemplate в одном приложении Spring Boot:

  1. Внедрение именованного компонента с помощью @Autowired @Qualifier("beanname") RedisTemplate myTemplate и создание компонента с помощью @Bean(name = "beanname").
  2. Типобезопасная инъекция путем указания параметров типа в RedisTemplate (например, @Autowired RedisTemplate<byte[], byte[]> byteTemplate и @Autowired RedisTemplate<String, String> stringTemplate).

Вот код для создания двух разных:

@Configuration
public class Config {

    @Bean
    public RedisTemplate<String, String> stringTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, String> stringTemplate = new RedisTemplate<>();
        stringTemplate.setConnectionFactory(redisConnectionFactory);
        stringTemplate.setDefaultSerializer(new StringRedisSerializer());
        stringTemplate.afterPropertiesSet();

        return stringTemplate;
    }

    @Bean
    public RedisTemplate<byte[], byte[]> byteTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<byte[], byte[]> byteTemplate = new RedisTemplate<>();
        byteTemplate.setConnectionFactory(redisConnectionFactory);
        byteTemplate.afterPropertiesSet();

        return byteTemplate;
    }

}

ХТХ, Марк

person mp911de    schedule 21.02.2016
comment
Большое спасибо, это решает мою проблему. Следующий вопрос: когда я объявляю такой bean-компонент, как Spring узнает, что нужно передать мне желаемую RedisConnectionFactory? Вероятно, это связано с тем, что я все еще знаком с механизмом Spring, и буду признателен, если вы сможете меня обучить этому. - person Derek; 22.02.2016
comment
Когда есть только одна фабрика соединений, не беспокойтесь. Если их несколько, вы должны квалифицировать их снова, иначе вы получите NoUniqueBeanDefinitionException. - person mp911de; 22.02.2016