找回密码
 立即注册
首页 业界区 安全 若依分离版多环境Redis配置(单机/集群自适应) ...

若依分离版多环境Redis配置(单机/集群自适应)

晁红叶 2025-5-31 23:52:09
功能概述

实现Spring Boot项目在本地开发、测试环境和生产环境无缝切换Redis模式,通过统一配置体系适配不同部署场景。
核心代码实现

1. Redisson多模式配置类
  1. package com.aspire.datasynchron.framework.config;
  2. import com.aspire.datasynchron.common.utils.StringUtils;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.redisson.Redisson;
  5. import org.redisson.api.RBucket;
  6. import org.redisson.api.RedissonClient;
  7. import org.redisson.config.ClusterServersConfig;
  8. import org.redisson.config.Config;
  9. import org.redisson.config.SingleServerConfig;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  14. import org.springframework.context.annotation.Bean;
  15. import org.springframework.context.annotation.Configuration;
  16. import javax.annotation.PostConstruct;
  17. /**
  18. * Redisson 配置类,支持 Redis 集群模式
  19. *
  20. * @author ruoyi
  21. */
  22. @Configuration
  23. public class RedissonConfig {
  24.     @Value("${spring.redis.mode:single}")  // 默认单机模式
  25.     private String mode;
  26.     // 单机模式配置
  27.     @Value("${spring.redis.host:127.0.0.1}")
  28.     private String host;
  29.     @Value("${spring.redis.port:6379}")
  30.     private int port;
  31.     private static final Logger log = LoggerFactory.getLogger(RedissonConfig.class);
  32.     @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}")
  33.     private String clusterNodes; // 集群节点列表,格式:192.168.1.101:7001,192.168.1.102:7002,...
  34.     @Value("${spring.redis.password}")
  35.     private String password; // Redis 密码(可为空)
  36.     private RedissonClient redissonClient; // 成员变量
  37.     @Bean(destroyMethod = "shutdown")
  38.     @ConditionalOnMissingBean(RedissonClient.class)
  39.     public RedissonClient redissonClient() {
  40.         if ("single".equalsIgnoreCase(mode) && StringUtils.isNotBlank(clusterNodes)) {
  41.             Config config = new Config();
  42.             String address = "redis://" + host + ":" + port;
  43.             SingleServerConfig serverConfig = config.useSingleServer()
  44.                     .setAddress(address)
  45.                     .setDatabase(1);
  46.             if (StringUtils.hasText(password)) {
  47.                 serverConfig.setPassword(password);
  48.             }
  49.             return Redisson.create(config);
  50.         }else {
  51.             Config config = new Config();
  52.             log.info("Redisson 配置初始化开始...");
  53.             log.info("集群节点列表: {}", clusterNodes);
  54.             // 配置 Redis 集群模式
  55.             ClusterServersConfig clusterConfig = config.useClusterServers();
  56.             // 格式化节点地址,添加 redis:// 前缀
  57.             String[] nodes = clusterNodes.split(",");
  58.             String[] formattedNodes = new String[nodes.length];
  59.             for (int i = 0; i < nodes.length; i++) {
  60.                 formattedNodes[i] = "redis://" + nodes[i].trim();
  61.             }
  62.             clusterConfig.addNodeAddress(formattedNodes);
  63.             // 如果启用了密码认证,则设置密码
  64.             if (password != null && !password.isEmpty()) {
  65.                 clusterConfig.setPassword(password);
  66.             }
  67.             // 可选配置
  68.             clusterConfig.setScanInterval(2000); // 集群状态扫描间隔(毫秒)
  69.             clusterConfig.setIdleConnectionTimeout(10000); // 空闲连接超时时间
  70.             clusterConfig.setConnectTimeout(10000); // 连接超时时间
  71.             clusterConfig.setTimeout(3000); // 操作超时时间
  72.             redissonClient = Redisson.create(config); // 保存到成员变量
  73.             return redissonClient;
  74.         }
  75.     }
  76. }
复制代码
多环境配置示例

1. 开发/测试环境配置(application-dev.yml)
  1. spring:
  2.   redis:
  3.     mode: single                   # 单机模式
  4.     host: 127.0.0.1                # Redis地址
  5.     port: 6379                     # Redis端口
  6.     password:                      # 密码(可选)
  7.     lettuce:
  8.       pool:
  9.         max-active: 8              # 连接池最大连接数
  10.         max-idle: 8                # 最大空闲连接
  11.         min-idle: 0                # 最小空闲连接
复制代码
2. 生产环境配置(application-prod.yml)
  1. spring:
  2.   redis:
  3.     mode: cluster                  # 集群模式
  4.     cluster:
  5.       nodes:                       # 集群节点列表(需包含完整地址)
  6.         - 10.120.75.50:7400
  7.         - 10.120.75.50:7401
  8.         - 10.120.75.50:7402
  9.         - 10.120.75.51:7403
  10.         - 10.120.75.51:7404
  11.         - 10.120.75.51:7405
  12.     password: YourProductionPass123# 密码(生产环境必填)
  13.     lettuce:
  14.       pool:
  15.         max-active: 16             # 连接池最大连接数
  16.         max-idle: 8                # 最大空闲连接
  17.         min-idle: 2                # 最小空闲连接
复制代码
关键优化说明


  • 智能模式切换

    • 优先识别cluster模式配置
    • 当集群配置缺失时自动降级单机模式
    • 通过@ConditionalOnProperty实现配置隔离

  • 配置预处理

    • 自动去除节点地址中的冗余协议头
    • 统一密码配置入口
    • 地址格式标准化处理

  • 容错机制

    • 初始化失败时抛出明确异常
    • 空值安全处理(密码、节点列表)
    • 连接参数动态适配

  • 运维友好设计

    • 详细启动日志输出
    • 配置参数校验提示
    • 连接池参数分级控制

部署注意事项


  • 环境变量覆盖
    通过启动参数覆盖配置:
    1. 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流水线进行环境参数注入。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册