如何在 Spring 引导应用程序中创建第二个 RedisTemplate 实例
How to create a second RedisTemplate instance in a Spring Boot application
根据 this answer,一个 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()
也不会工作,因为它抱怨找不到连接工厂。
我知道这个请求可能与在 Spring 应用程序中定义另一个 bean 没有太大区别,但不确定当前的 Spring-Data-Redis 集成对我来说最好的方法是什么.请帮忙,谢谢。
您可以按照两种方式在一个 Spring 启动应用程序中使用多个 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());
return stringTemplate;
}
@Bean
public RedisTemplate<byte[], byte[]> byteTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<byte[], byte[]> byteTemplate = new RedisTemplate<>();
byteTemplate.setConnectionFactory(redisConnectionFactory);
return byteTemplate;
}
}
HTH,马克
根据 this answer,一个 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()
也不会工作,因为它抱怨找不到连接工厂。
我知道这个请求可能与在 Spring 应用程序中定义另一个 bean 没有太大区别,但不确定当前的 Spring-Data-Redis 集成对我来说最好的方法是什么.请帮忙,谢谢。
您可以按照两种方式在一个 Spring 启动应用程序中使用多个 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());
return stringTemplate;
}
@Bean
public RedisTemplate<byte[], byte[]> byteTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<byte[], byte[]> byteTemplate = new RedisTemplate<>();
byteTemplate.setConnectionFactory(redisConnectionFactory);
return byteTemplate;
}
}
HTH,马克