Redis - Redis command timed out nested exception is io.lettuce.core.RedisCommandTimeoutException

本文介绍如何解决从Spring Boot 1.X升级到2.X后出现的Redis命令超时错误。通过调整Maven依赖配置,排除lettuce-core并引入jedis来解决此问题。

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

Redis - Redis command timed out nested exception is io.lettuce.core.RedisCommandTimeoutException

这个问题应该是我在将SpringBoot1.X升级到2.X的时候产生的版本问题。
原pom中的redis依赖
在这里插入图片描述

更改为

	<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
			<exclusions>
				<exclusion>
					<groupId>io.lettuce</groupId>
					<artifactId>lettuce-core</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
	</dependency>

在这里插入图片描述
之后就没报错了

### 3.1 调整Lettuce客户端的超时配置 `io.lettuce.core.RedisCommandTimeoutException`通常表示Redis命令执行超时。Lettuce允许通过`TimeoutOptions`自定义超时行为。可以结合`TimeoutSource`接口实现动态超时控制,例如对某些命令(如`BLPOP`)使用参数指定的超时时间,其他命令则使用默认超时[^3]。 ```java TimeoutOptions timeoutOptions = TimeoutOptions.builder() .timeoutSource(command -> { if (command.getType() == CommandType.BLPOP) { return TimeUnit.MILLISECONDS.toNanos(CommandArgsAccessor.getFirstInteger(command.getArgs())); } return -1; // -1 表示使用默认超时 }) .build(); ``` ### 3.2 增加默认超时时间 若未显式配置超时时间,Lettuce将使用默认值。可以通过设置`ClientOptions`来调整默认的命令超时时间,例如将默认超时从1800毫秒增加到更合理的值: ```java ClientOptions clientOptions = ClientOptions.builder() .timeoutOptions(TimeoutOptions.enabled(Duration.ofSeconds(10))) // 设置默认超时为10秒 .build(); ``` ### 3.3 检查网络与Redis服务器状态 Lettuce基于Netty实现非阻塞IO,具备良好的网络性能[^4]。但在Redis服务器重启或网络不稳定时,仍可能出现连接问题。确保Redis服务正常运行,并检查客户端与服务器之间的网络连通性。Lettuce在连接断开后会自动尝试重连,但需要确保配置中启用了自动重连机制: ```java ClientOptions clientOptions = ClientOptions.builder() .autoReconnect(true) .build(); ``` ### 3.4 优化Redis命令执行效率 若Redis命令执行时间过长,也可能导致超时。应避免在Redis中执行复杂或耗时操作,如大范围的`KEYS`命令、`SLOWLOG`未优化的查询等。可以使用`SLOWLOG GET`命令查看慢查询日志,识别并优化耗时命令。 ### 3.5 调整Lettuce连接池配置 Lettuce默认使用共享连接模式,若并发请求较高,可能导致连接资源不足。可考虑启用连接池配置,提高并发能力: ```java GenericObjectPoolConfig<RedisConnection<String, String>> poolConfig = new GenericObjectPoolConfig<>(); poolConfig.setMaxTotal(100); poolConfig.setMaxIdle(50); poolConfig.setMinIdle(10); RedisConnectionFactory factory = new LettuceConnectionFactory(redisStandaloneConfiguration); factory.setPoolConfig(poolConfig); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值