package org.dromara.zhishu.config;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class SecondRedissonConfig {

    @Bean
    @Primary
    public RedissonClient redissonClient() {
        Config config = new Config();

        // ✅ 优化：4核6G配置，提高线程数充分利用CPU
        config.setThreads(8);          // 从4改为8，充分利用4核CPU
        config.setNettyThreads(16);    // 从8改为16，提高网络IO处理能力

        config.setCodec(new JsonJacksonCodec());

        config.useSingleServer()
                .setAddress("redis://146.56.227.42:6379")
                .setDatabase(0)
                .setPassword("Qq123123")
                .setClientName("ruoyi_primary")

                // ✅ 优化：增大连接池，提高并发处理能力
                .setConnectionMinimumIdleSize(4)      // 从2改为4
                .setConnectionPoolSize(16)            // 从8改为16，支持更高并发
                .setIdleConnectionTimeout(30000)      // 从10秒改为30秒，减少连接重建开销

                // 保持合理的超时时间
                .setConnectTimeout(5000)              // 连接超时5秒
                .setTimeout(3000)                     // 操作超时3秒
                .setRetryAttempts(3)                  // 从2改为3次重试，提高容错

                // ✅ 优化：增大订阅连接池
                .setSubscriptionConnectionPoolSize(8)  // 从5改为8

                // ✅ 优化：保活设置
                .setPingConnectionInterval(60000)      // 从30秒改为60秒，减少网络开销
                .setKeepAlive(true)                   // 启用keep-alive

                .setRetryInterval(1500)
                .setDnsMonitoringInterval(10000);      // 从5秒改为10秒

        return Redisson.create(config);
    }

    @Bean(name = "secondRedissonClient")
    public RedissonClient secondRedissonClient() {
        Config config = new Config();

        // ✅ 优化：提高次要Redis的线程配置
        config.setThreads(4);          // 从2改为4
        config.setNettyThreads(8);     // 从4改为8

        config.setCodec(new StringCodec());

        config.useSingleServer()
                .setAddress("redis://36.212.16.27:6379")
                .setDatabase(0)
                .setPassword("long6166")
                .setClientName("ruoyi_second")

                // ✅ 优化：增大连接池
                .setConnectionMinimumIdleSize(2)      // 从1改为2
                .setConnectionPoolSize(8)             // 从4改为8
                .setIdleConnectionTimeout(30000)      // 从10秒改为30秒

                .setConnectTimeout(5000)
                .setTimeout(3000)
                .setRetryAttempts(2)                  // 从1改为2

                .setSubscriptionConnectionPoolSize(4) // 从2改为4

                .setPingConnectionInterval(60000)     // 从30秒改为60秒
                .setKeepAlive(true)

                .setRetryInterval(1500)
                .setDnsMonitoringInterval(10000);

        return Redisson.create(config);
    }

    @Bean(name = "thirdRedissonClient")
    public RedissonClient thirdRedissonClient() {
        Config config = new Config();

        // ✅ 优化：第三个Redis实例的线程配置
        config.setThreads(8);          // 保持8
        config.setNettyThreads(16);    // 保持16

        config.setCodec(new StringCodec());

        config.useSingleServer()
                .setAddress("redis://36.212.20.113:7963")
                .setDatabase(7)
                .setPassword("j8nZ4jra2E")
                .setClientName("ruoyi_third")

                // ✅ 优化：调整连接池大小，避免过度占用内存
                .setConnectionMinimumIdleSize(8)      // 从16改为8
                .setConnectionPoolSize(24)            // 从32改为24，避免内存浪费
                .setIdleConnectionTimeout(30000)      // 从10秒改为30秒
                .setConnectTimeout(10000)
                .setTimeout(3000)

                // ✅ 优化：订阅连接池
                .setSubscriptionConnectionPoolSize(16) // 从25改为16

                // ✅ 新增：添加保活设置
                .setPingConnectionInterval(60000)     // 60秒ping一次
                .setKeepAlive(true)                   // 启用keep-alive
                .setRetryAttempts(3)                  // 3次重试
                .setRetryInterval(1500)               // 重试间隔
                .setDnsMonitoringInterval(10000);     // DNS监控间隔

        return Redisson.create(config);
    }
}