功能概述
实现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流水线进行环境参数注入。
评论0
暂时没有评论