7

根据这个答案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 的模板被解析为 autoconfigured stringRedisTemplate

手动调用RedisTemplate' 构造函数然后它afterPropertiesSet()也不会工作,因为它抱怨找不到连接工厂。

我知道这个请求可能与在 Spring 应用程序中定义另一个 bean 没有太大区别,但不确定当前的 Spring-Data-Redis 集成对我来说最好的方法是什么。请帮忙,谢谢。

4

1 回答 1

12

您可以通过两种方式RedisTemplate在一个 Spring Boot 应用程序中使用多个 s:

  1. 使用 命名 bean 注入@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;
    }

}

HTH,马克

于 2016-02-21T21:20:45.950 回答