在Spring Boot項目中可以通過多數據源配置的方式使用兩個不同地址的Redis實例。以下是具體實現方案
1.依賴配置
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>
2.配置文件設置
在application.yml
中分別定義兩個Redis實例的配置項
spring:redis:redis1:host: 192.168.1.100port: 6379password: pass1database: 0redis2:host: 192.168.1.101port: 6380password: pass2database: 1
3.配置類創建
為每個Redis實例創建獨立的RedisConnectionFactory
和RedisTemplate
@Configuration
public class RedisConfig {// Redis實例1配置@Bean(name = "redis1ConnectionFactory")public RedisConnectionFactory redis1ConnectionFactory(@Value("${spring.redis.redis1.host}") String host,@Value("${spring.redis.redis1.port}") int port) {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);config.setPassword(RedisPassword.of("pass1"));return new JedisConnectionFactory(config);}@Bean(name = "redis1Template")public RedisTemplate<String, Object> redis1Template(@Qualifier("redis1ConnectionFactory") RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));return template;}// 重復上述步驟配置Redis實例2
}
4.使用不同Redis示例
在業務代碼中通過@Qualifier
注入對應的模板:
@Autowired
@Qualifier("redis1Template")
private RedisTemplate<String, Object> redis1Template;@Autowired
@Qualifier("redis2Template")
private RedisTemplate<String, Object> redis2Template;
注意事項
-
?連接池優化?
需為每個實例單獨配置連接池參數(如最大連接數、超時時間),避免資源競爭。例如在配置文件中添加max-active
、max-idle
等參數。 -
?主從與集群區分?
若兩個Redis實例為集群模式,需使用RedisClusterConfiguration
替代RedisStandaloneConfiguration
。 -
?序列化兼容性?
建議統一使用Jackson2JsonRedisSerializer
或StringRedisSerializer
,避免不同模板序列化方式不一致導致數據讀取失敗。 -
?動態切換?
若需運行時動態切換數據源,可通過RedisTemplate.setConnectionFactory()
方法實現,但需注意線程安全問題