首页 文章

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

提问于
浏览
4

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

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

组件1声明,

@Autowired
    private RedisTemplate redisTemplate;

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

组件2声明,

@Autowired
    private StringRedisTemplate stringRedisTemplate;

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

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

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

1 回答

  • 6

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

    • 使用 @Autowired @Qualifier("beanname") RedisTemplate myTemplate 命名bean注入并使用 @Bean(name = "beanname") 创建bean .

    • 通过在 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,马克

相关问题