如何在Spring Boot应用程序中创建第二个RedisTemplate实例

Der*_*rek 4 spring-data-redis spring-boot

根据这个答案,人们RedisTemplate不能支持多个值序列化器.所以我想为不同的需求创建多个RedisTemplate,特别是一个用于字符串操作,一个用于JSON序列化的对象,用于RedisCacheManager.我正在使用Spring Boot并且当前RedisTemplate是自动装配的,我想知道声明第二个RedisTemplate实例共享同一个Jedis连接工厂但有自己的序列化器的正确方法是什么?

在两个不同的组件中尝试过类似的东西,

组件1声明,

    @Autowired
    private RedisTemplate redisTemplate;

    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Instance.class));
Run Code Online (Sandbox Code Playgroud)

组件2声明,

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,两个模板实际上是相同的.追溯到Spring代码,发现组件1的模板已解析为自动配置stringRedisTemplate.

手动调用RedisTemplate的构造函数然后afterPropertiesSet()它将无法工作,因为它抱怨没有找到连接工厂.

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

mp9*_*1de 7

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

  1. 用bean命名bean注入@Autowired @Qualifier("beanname") RedisTemplate myTemplate并创建bean @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;
    }

}
Run Code Online (Sandbox Code Playgroud)

HTH,马克