【亲测可用】SpringBoot使用Redis的Lettuce连接池报RedisCommandTimeoutException

本文详细介绍了在SpringBoot项目中遇到Lettuce连接Redis时出现的RedisCommandTimeoutException问题,分析了两个根本原因:Lettuce默认无心跳检测和服务器内存不足。并提供了一个亲测有效的解决方案,即通过定时任务定期检测Lettuce连接。同时,列举了网上其他三种解决方案的优缺点。

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

目录

一、问题详情

二、根本原因

三、解决方案


一、问题详情

在最近新项目的开发当中,当项目刚启动的时候访问Redis服务一切正常,但是过了几分钟后再次访问Redis就报如下错误。

'Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 10 second(s)'

二、根本原因

这个问题我也是第一次碰到,所以我搜索了网上大量的解决方案,总之层次不齐,我通过一晚上的测试和整理,梳理了一下本次问题的两个根本原因:

1、SpringBoot2.0版本以上默认采用了Lettuce作为连接池,但是Lettuce默认是不进行心跳检测的,从而导致了连接超时。

2、服务器的内存不够,我自己的服务器是购买的最便宜的,内存只有2G,导致分配给Redis内存不够,从而运行不稳定,我yml文件配置的明明是10秒过期,有的时候过了5分钟才报了RedisCommandTimeoutException的错误信息,也非常怀疑和我的服务器配置有关。

三、解决方案

可以通过在Spring Boot中配置Lettuce连接池的validateConnection属性来检连接的可用性。validateConnection属性默认为false,需要手动设置为true。 具体配置方式如下: 1. application.properties文件中添加以下配置: ``` spring.redis.lettuce.pool.validate-connection=true spring.redis.lettuce.pool.min-idle=1 spring.redis.lettuce.pool.max-idle=5 spring.redis.lettuce.pool.max-active=10 spring.redis.lettuce.pool.max-wait=-1ms ``` 其中,validate-connection设置为true表示开启连接可用性检,min-idle、max-idle、max-active和max-wait分别表示连接池中的最小空闲连接数、最大空闲连接数、最大活跃连接数和最大等待时间。 2. 通过配置LettucePoolingClientConfiguration类来创建Lettuce连接池: ``` @Configuration public class RedisConfig { @Bean public LettuceConnectionFactory redisConnectionFactory() { LettuceClientConfiguration lettuceClientConfiguration = LettucePoolingClientConfiguration.builder() .validateConnection(true) .build(); RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); redisStandaloneConfiguration.setHostName("localhost"); redisStandaloneConfiguration.setPort(6379); return new LettuceConnectionFactory(redisStandaloneConfiguration, lettuceClientConfiguration); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } } ``` 在LettucePoolingClientConfiguration中通过builder方法创建一个Lettuce连接池配置对象,并将validateConnection设置为true,然后将该配置对象和RedisStandaloneConfiguration对象一起传入LettuceConnectionFactory的构造方法中来创建Lettuce连接池。 最后,将LettuceConnectionFactory对象注入到RedisTemplate中即可使用。 以上是配置Lettuce连接池连接可用性的方法,希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄团团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值