若依分離版多環境Redis配置(單機/集群自適應)
功能概述
實現Spring Boot項目在本地開發、測試環境和生產環境無縫切換Redis模式,通過統一配置體系適配不同部署場景。
核心代碼實現
1. Redisson多模式配置類
package com.aspire.datasynchron.framework.config;
import com.aspire.datasynchron.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
/**
* Redisson 配置類,支持 Redis 集群模式
*
* @author ruoyi
*/
@Configuration
public class RedissonConfig {
@Value("${spring.redis.mode:single}") // 默認單機模式
private String mode;
// 單機模式配置
@Value("${spring.redis.host:127.0.0.1}")
private String host;
@Value("${spring.redis.port:6379}")
private int port;
private static final Logger log = LoggerFactory.getLogger(RedissonConfig.class);
@Value("${spring.redis.cluster.nodes:10.120.75.50:7400,10.120.75.50:7401,10.120.75.50:7402,10.120.75.51:7403,10.120.75.51:7404,10.120.75.51:7405}")
private String clusterNodes; // 集群節點列表,格式:192.168.1.101:7001,192.168.1.102:7002,...
@Value("${spring.redis.password}")
private String password; // Redis 密碼(可為空)
private RedissonClient redissonClient; // 成員變量
@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(RedissonClient.class)
public RedissonClient redissonClient() {
if ("single".equalsIgnoreCase(mode) && StringUtils.isNotBlank(clusterNodes)) {
Config config = new Config();
String address = "redis://" + host + ":" + port;
SingleServerConfig serverConfig = config.useSingleServer()
.setAddress(address)
.setDatabase(1);
if (StringUtils.hasText(password)) {
serverConfig.setPassword(password);
}
return Redisson.create(config);
}else {
Config config = new Config();
log.info("Redisson 配置初始化開始...");
log.info("集群節點列表: {}", clusterNodes);
// 配置 Redis 集群模式
ClusterServersConfig clusterConfig = config.useClusterServers();
// 格式化節點地址,添加 redis:// 前綴
String[] nodes = clusterNodes.split(",");
String[] formattedNodes = new String[nodes.length];
for (int i = 0; i < nodes.length; i++) {
formattedNodes[i] = "redis://" + nodes[i].trim();
}
clusterConfig.addNodeAddress(formattedNodes);
// 如果啟用了密碼認證,則設置密碼
if (password != null && !password.isEmpty()) {
clusterConfig.setPassword(password);
}
// 可選配置
clusterConfig.setScanInterval(2000); // 集群狀態掃描間隔(毫秒)
clusterConfig.setIdleConnectionTimeout(10000); // 空閑連接超時時間
clusterConfig.setConnectTimeout(10000); // 連接超時時間
clusterConfig.setTimeout(3000); // 操作超時時間
redissonClient = Redisson.create(config); // 保存到成員變量
return redissonClient;
}
}
}
多環境配置示例
1. 開發/測試環境配置(application-dev.yml)
spring:
redis:
mode: single # 單機模式
host: 127.0.0.1 # Redis地址
port: 6379 # Redis端口
password: # 密碼(可選)
lettuce:
pool:
max-active: 8 # 連接池最大連接數
max-idle: 8 # 最大空閑連接
min-idle: 0 # 最小空閑連接
2. 生產環境配置(application-prod.yml)
spring:
redis:
mode: cluster # 集群模式
cluster:
nodes: # 集群節點列表(需包含完整地址)
- 10.120.75.50:7400
- 10.120.75.50:7401
- 10.120.75.50:7402
- 10.120.75.51:7403
- 10.120.75.51:7404
- 10.120.75.51:7405
password: YourProductionPass123# 密碼(生產環境必填)
lettuce:
pool:
max-active: 16 # 連接池最大連接數
max-idle: 8 # 最大空閑連接
min-idle: 2 # 最小空閑連接
關鍵優化說明
- 智能模式切換
- 優先識別
cluster模式配置 - 當集群配置缺失時自動降級單機模式
- 通過
@ConditionalOnProperty實現配置隔離
- 優先識別
- 配置預處理
- 自動去除節點地址中的冗余協議頭
- 統一密碼配置入口
- 地址格式標準化處理
- 容錯機制
- 初始化失敗時拋出明確異常
- 空值安全處理(密碼、節點列表)
- 連接參數動態適配
- 運維友好設計
- 詳細啟動日志輸出
- 配置參數校驗提示
- 連接池參數分級控制
部署注意事項
-
環境變量覆蓋
通過啟動參數覆蓋配置:java -jar -Dspring.redis.mode=cluster -Dspring.redis.cluster.nodes="..." app.jar -
密碼安全
生產環境建議通過Vault等加密存儲密碼 -
節點發現
集群模式要求至少配置3個主節點地址 -
版本兼容
需Redisson 3.16+ 版本支持最新集群協議
常見問題排查
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 連接超時 | 防火墻限制/地址錯誤 | 檢查節點可達性 |
| 認證失敗 | 密碼配置錯誤 | 檢查密碼特殊字符轉義 |
| 集群初始化失敗 | 節點不可達/配置格式錯誤 | 使用redis-cli --cluster check驗證集群狀態 |
| 性能下降 | 連接池配置不合理 | 根據QPS調整pool參數 |
通過以上優化方案,可實現Redis配置的環境自適應,顯著提升多環境部署的可靠性和維護性。實際部署時建議配合CI/CD流水線進行環境參數注入。

浙公網安備 33010602011771號