package com.youlai.boot.config; import io.lettuce.core.ClientOptions; import io.lettuce.core.SocketOptions; import io.lettuce.core.resource.ClientResources; import io.lettuce.core.resource.DefaultClientResources; import io.lettuce.core.resource.Delay; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.connection.RedisConnectionFactory; import java.time.Duration; import java.util.concurrent.TimeUnit; /** * Redis 健康检查与启动容错配置 *

* 确保 Redis 不可用时程序仍能正常启动,并在 Redis 恢复后自动重连。 * * @since 4.6.0 */ @Slf4j @Configuration @ConditionalOnClass(RedisConnectionFactory.class) public class RedisHealthConfig { /** * 自定义 Lettuce ClientResources,增加优雅关闭和重连支持 */ @Bean(destroyMethod = "shutdown") @Primary public ClientResources lettuceClientResources() { DefaultClientResources resources = DefaultClientResources.builder() .reconnectDelay(Delay.exponential(Duration.ofSeconds(2), Duration.ofSeconds(30), 2, TimeUnit.SECONDS)) .build(); log.info("Lettuce ClientResources 初始化完成,重连延迟: 2s"); return resources; } /** * 自定义 ClientOptions,配置断开重连策略 */ @Bean @Primary public ClientOptions lettuceClientOptions() { ClientOptions options = ClientOptions.builder() .socketOptions(SocketOptions.builder() .connectTimeout(Duration.ofSeconds(5)) // 连接超时 5 秒 .keepAlive(true) // 启用 TCP KeepAlive .build()) // 断开后自动重连 .autoReconnect(true) // 取消正在执行的命令超时(避免连接断开时命令永久挂起) .cancelCommandsOnReconnectFailure(true) // 连接断开时挂起的请求超时 .suspendReconnectOnProtocolFailure(true) .build(); log.info("Lettuce ClientOptions 初始化完成,autoReconnect=true"); return options; } }