若依分离版多环境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                # 最小空闲连接

关键优化说明

  1. 智能模式切换
    • 优先识别cluster模式配置
    • 当集群配置缺失时自动降级单机模式
    • 通过@ConditionalOnProperty实现配置隔离
  2. 配置预处理
    • 自动去除节点地址中的冗余协议头
    • 统一密码配置入口
    • 地址格式标准化处理
  3. 容错机制
    • 初始化失败时抛出明确异常
    • 空值安全处理(密码、节点列表)
    • 连接参数动态适配
  4. 运维友好设计
    • 详细启动日志输出
    • 配置参数校验提示
    • 连接池参数分级控制

部署注意事项

  1. 环境变量覆盖
    通过启动参数覆盖配置:

    java -jar -Dspring.redis.mode=cluster -Dspring.redis.cluster.nodes="..." app.jar
    
  2. 密码安全
    生产环境建议通过Vault等加密存储密码

  3. 节点发现
    集群模式要求至少配置3个主节点地址

  4. 版本兼容
    需Redisson 3.16+ 版本支持最新集群协议


常见问题排查

现象 可能原因 解决方案
连接超时 防火墙限制/地址错误 检查节点可达性
认证失败 密码配置错误 检查密码特殊字符转义
集群初始化失败 节点不可达/配置格式错误 使用redis-cli --cluster check验证集群状态
性能下降 连接池配置不合理 根据QPS调整pool参数

通过以上优化方案,可实现Redis配置的环境自适应,显著提升多环境部署的可靠性和维护性。实际部署时建议配合CI/CD流水线进行环境参数注入。

posted @ 2025-04-25 15:20  ghostmen  阅读(420)  评论(0)    收藏  举报