解决redis超时io.lettuce.core.RedisCommandTimeoutException: Connection timed out after 5s

博客详细描述了遇到Redis使用Lettuce连接超时的问题,异常为`RedisCommandTimeoutException`,并指出即使增加`spring.redis.timeout`设置也无法解决。作者发现该问题是由于Lettuce连接池存在的bug导致。解决方案是切换到使用Jedis连接池,并提供了添加Jedis依赖和配置application.properties的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错内容:


io.lettuce.core.RedisCommandTimeoutException: Connection initialization timed out. Command timed out after 1 minute(s)
    at io.lettuce.core.internal.ExceptionFactory.createTimeoutException(ExceptionFactory.java:65) ~[lettuce-core-6.1.4.RELEASE.jar:6.1.4.RELEASE]
    at io.lettuce.core.protocol.RedisHandshakeHandler.lambda$channelRegistered$0(RedisHandshakeHandler.java:62) ~[lettuce-core-6.1.4.RELEASE.jar:6.1.4.RELEASE]
    at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.67.Final.jar:4.1.67.Final]
    at io.netty.util.concurrent.PromiseTask.run(PromiseTask.java:106) ~[netty-common-4.1.67.Final.jar:4.1.67.Final]

### Spring Data RedisLettuce 报 QueryTimeoutException 的分析与解决方案 当在 Windows 上部署 Redis 并使用 Spring Data RedisLettuce 驱动时,如果遇到 `QueryTimeoutException` 或者 `RedisCommandTimeoutException`,这通常表明客户端请求未能在指定的时间内完成。以下是可能的原因以及对应的解决方案。 #### 1. 调整超时配置 默认情况下,Lettuce 客户端会设置一个较短的命令执行超时时间(通常是 5 秒)。可以通过修改 `spring.redis.timeout` 参数来增加这个超时时间。例如: ```properties spring.redis.timeout=10000 # 设置为 10 秒 ``` 此外,还可以通过自定义 Lettuce 的连接工厂进一步调整超时参数[^2]: ```java import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; import io.lettuce.core.ClientOptions; @Bean public RedisConnectionFactory redisConnectionFactory() { LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder() .commandTimeout(Duration.ofSeconds(10)) // 命令超时时间为 10 秒 .clientOptions(ClientOptions.builder().autoReconnect(true).build()) // 启用自动重连 .build(); return new LettuceConnectionProvider(clientConfig); } ``` #### 2. 检查网络延迟和带宽 Windows 环境下运行 Redis 可能存在较高的网络延迟或者较低的吞吐量。建议测试本地主机到 Redis 实例之间的网络性能。可以使用工具如 `ping` 测试延迟,或使用 `iperf` 工具评估带宽。 #### 3. 数据库负载过高 如果 Redis 正处于高负载状态,则可能会导致某些操作无法及时响应。此时应监控 Redis 性能指标,比如 CPU 使用率、内存占用情况等。可以启用慢查询日志功能以定位耗时较长的操作: ```bash config set slowlog-log-slower-than 10000 # 记录超过 10ms 的查询 config set slowlog-max-len 1024 # 设定最大记录数 slowlog get # 查看慢查询日志 ``` #### 4. Windows 特有的文件句柄限制 由于 Windows 对于单进程打开文件数量有限制,默认值可能不足以支持大量并发连接。可以通过注册表编辑器提高该限制值[^3]: - 打开 Regedit; - 导航至路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management; - 创建名为 PoolTagOrder 的字符串键值项并赋值为 "File"; - 修改 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 下的最大工作线程数目 MaxWorkItems。 #### 5. 升级依赖版本 确保使用的 Spring Boot 和 Spring Data Redis 是最新稳定版,因为旧版本可能存在已知 bug。同时也要确认所选 Lettuce 库与其兼容性良好。 --- ### 示例代码片段 下面是一个完整的 Java 配置类示例,用于定制化 Lettuce 连接行为: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); LettucePoolingClientConfiguration config = LettucePoolingClientConfiguration.builder() .commandTimeout(Duration.ofSeconds(15)) .shutdownTimeout(Duration.ZERO) .build(); template.setConnectionFactory(factory); return template; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值