|
|
springboot如何连接不同序号的redis数据库,即连接多个不同的数据库
给两个 Redis 连接工厂,分别指向不同的 DB,再各自绑定到不同的 RedisTemplate。
- package com.example.config;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
- import org.springframework.boot.context.properties.EnableConfigurationProperties;
- import org.springframework.context.annotation.*;
- import org.springframework.data.redis.connection.*;
- import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.data.redis.serializer.*;
- @Configuration
- @EnableConfigurationProperties(RedisProperties.class)
- public class RedisMultiDbConfig {
- // JSON/String 对象用的连接(DB=app.redis.json-database,默认0)
- @Primary
- @Bean("jsonConnectionFactory")
- public LettuceConnectionFactory jsonConnectionFactory(
- RedisProperties props,
- @Value("${app.redis.json-database:0}") int db) {
- RedisStandaloneConfiguration cfg = new RedisStandaloneConfiguration(props.getHost(), props.getPort());
- if (props.getPassword() != null) cfg.setPassword(RedisPassword.of(props.getPassword()));
- cfg.setDatabase(db);
- return new LettuceConnectionFactory(cfg);
- }
- // 二进制用的连接(DB=app.redis.binary-database,默认1)
- @Bean("binaryConnectionFactory")
- public LettuceConnectionFactory binaryConnectionFactory(
- RedisProperties props,
- @Value("${app.redis.binary-database:1}") int db) {
- RedisStandaloneConfiguration cfg = new RedisStandaloneConfiguration(props.getHost(), props.getPort());
- if (props.getPassword() != null) cfg.setPassword(RedisPassword.of(props.getPassword()));
- cfg.setDatabase(db);
- return new LettuceConnectionFactory(cfg);
- }
- // JSON 模板(默认注入)
- @Primary
- @Bean
- public RedisTemplate<String, Object> redisTemplate(
- @Qualifier("jsonConnectionFactory") RedisConnectionFactory cf) {
- RedisTemplate<String, Object> t = new RedisTemplate<>();
- t.setConnectionFactory(cf);
- t.setKeySerializer(StringRedisSerializer.UTF_8);
- t.setHashKeySerializer(StringRedisSerializer.UTF_8);
- GenericJackson2JsonRedisSerializer json = new GenericJackson2JsonRedisSerializer();
- t.setValueSerializer(json);
- t.setHashValueSerializer(json);
- t.afterPropertiesSet();
- return t;
- }
- // 二进制模板(value=byte[])
- @Bean("binaryRedisTemplate")
- public RedisTemplate<String, byte[]> binaryRedisTemplate(
- @Qualifier("binaryConnectionFactory") RedisConnectionFactory cf) {
- RedisTemplate<String, byte[]> t = new RedisTemplate<>();
- t.setConnectionFactory(cf);
- t.setKeySerializer(StringRedisSerializer.UTF_8);
- t.setHashKeySerializer(StringRedisSerializer.UTF_8);
- t.setValueSerializer(RedisSerializer.byteArray());
- t.setHashValueSerializer(RedisSerializer.byteArray());
- t.afterPropertiesSet();
- return t;
- }
- }
复制代码 application.yml
- spring:
- redis:
- host: 127.0.0.1
- port: 6379
- # password: yourpwd
- app:
- redis:
- json-database: 0 # 对象模板使用的 DB
- binary-database: 1 # 二进制模板使用的 DB
复制代码 使用
- @Autowired private RedisTemplate<String, Object> redisTemplate; // 走 DB0
- @Autowired @Qualifier("binaryRedisTemplate") private RedisTemplate<String, byte[]> binTpl; // 走 DB1
复制代码注意 - 以上仅适用于单机/主从模式。Redis Cluster 不支持多 DB,固定为 0,需要用 key 前缀区分。
结论 - 需要两个不同 DB(例如字符串用 DB0、二进制用 DB1)时,必须自己声明两个 RedisConnectionFactory。因为 Spring Boot 的默认工厂是按 ConditionalOnMissingBean(RedisConnectionFactory) 创建的,只要你自己声明了任意一个 RedisConnectionFactory,默认工厂就不会再被创建,所以不能“一半用默认一半自定义”。
如何选择 - 只用同一个 DB:不要声明任何 ConnectionFactory,直接用 Boot 的默认 factory,给出两个不同的 RedisTemplate 即可(它们共用一个 DB)。
- 用两个不同 DB:手动声明两个 ConnectionFactory(jsonConnectionFactory、binaryConnectionFactory),分别配置 database 索引,然后各自绑定到对应的 RedisTemplate;可用 @Primary 或 @Qualifier 解决注入歧义。
示例A:同一 DB(共用默认工厂)
- @Configuration
- public class RedisTemplatesSameDbConfig {
- @Bean
- public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory cf) { /* JSON 配置 */ }
- @Bean(name = "binaryRedisTemplate")
- public RedisTemplate<String, byte[]> binaryRedisTemplate(RedisConnectionFactory cf) {
- RedisTemplate<String, byte[]> t = new RedisTemplate<>();
- t.setConnectionFactory(cf); // 使用默认 factory -> 同一 DB
- t.setKeySerializer(StringRedisSerializer.UTF_8);
- t.setValueSerializer(RedisSerializer.byteArray());
- t.afterPropertiesSet();
- return t;
- }
- }
复制代码 示例B:两个不同 DB(必须同时自定义两个 factory)
- @Configuration
- public class RedisMultiDbConfig {
- @Primary
- @Bean("jsonConnectionFactory")
- public LettuceConnectionFactory jsonCF(RedisProperties props,
- @Value("${app.redis.json-database:0}") int db) { /* host/port/pwd + cfg.setDatabase(db) */ }
- @Bean("binaryConnectionFactory")
- public LettuceConnectionFactory binCF(RedisProperties props,
- @Value("${app.redis.binary-database:1}") int db) { /* 同上,db 不同 */ }
- @Primary
- @Bean
- public RedisTemplate<String, Object> redisTemplate(
- @Qualifier("jsonConnectionFactory") RedisConnectionFactory cf) { /* JSON 模板 */ }
- @Bean("binaryRedisTemplate")
- public RedisTemplate<String, byte[]> binaryRedisTemplate(
- @Qualifier("binaryConnectionFactory") RedisConnectionFactory cf) { /* 二进制模板 */ }
- }
复制代码提示 - Redis Cluster 不支持多 DB,固定为 0;如是集群只能用 key 前缀区分,无法用不同 DB。
|
|