Redis连接长时间不使用超时问题解决

在项目中遇到一个问题:当SpringBoot连接Redis时,长时间不使用会报错,提示Redis命令超时

Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 10 second(s)
	at io.lettuce.core.internal.ExceptionFactory.createTimeoutException(ExceptionFactory.java:59)
	at io.lettuce.core.internal.Futures.awaitOrCancel(Futures.java:246)
	at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:74)
	at org.springframework.data.redis.connection.lettuce.LettuceConnection.await(LettuceConnection.java:1083)

这表示Redis命令在指定时间内没有返回,通常可能是由于网络中断、空闲连接断开等原因导致的。

问题分析

主要是因为Redis连接长时间处于空闲状态后被断开,导致下一次访问时发生超时错误。

解决方案

1. 定时任务

使用了Spring的@Scheduled注解来定期执行一个Redis的PING命令,以检测并保持连接的活跃。

2. 控制心跳检测的启用

为了使这个心跳检测更加灵活,配置文件中自定义了一个配置用来控制是否开启

spring.redis.keep-alive=true

通过@ConditionalOnProperty注解控制心跳检测任务的启用。

代码实现

@EnableScheduling
@Component
@ConditionalOnProperty(name = "spring.redis.keep-alive", havingValue = "true")
public class RedisHealthCheck {

    @Resource
    private StringRedisTemplate springbRedisTemplate;

    // 每分钟执行一次
    @Scheduled(fixedRate = 60000)
    public void keepAlive() {
        try {
            // 执行Redis PING命令,检测连接是否活跃
            String result = Objects.requireNonNull(springbRedisTemplate.getConnectionFactory()).getConnection().ping();
            System.out.println("Redis PING Response: " + result);
        } catch (Exception e) {
            // 处理Redis连接异常
            System.err.println("Redis heartbeat failed: " + e.getMessage());
        }
    }
}

总结

通过这种方式,问题得到了彻底解决。使用定时任务向Redis发送PING命令,确保了长时间不使用Redis的情况下,连接不会断开。

Redis中,设置连接超时时间是为了主动回收空闲连接,以避免空闲连接占满连接池导致服务崩溃。默认情况下,Redis不会主动断开连接,即使客户端已经空闲了很长时间。为了配置连接超时时间,可以使用timeout参数。timeout参数的单位是秒(s),取值范围为0~100000,其中0表示无限制。建议在业务核心应用中设置合适的timeout值来具备主动回收资源的能力,避免整个业务的混乱和严重后果。 需要注意的是,在实际运行中,Redis不一定会精确地按照timeout的值规定的时间来断开空闲连接。例如,设置timeout为10s,但空闲连接可能在12s后,服务器中新增很多连接时才会被断开。为了降低这个延迟,可以适当增大hz参数的值,提高负责断开超时连接Redis定时任务的运行频率。 如果不设置超时时间,连接可能会长时间占用,可能导致报错:"could not get a resource from the pool"。因此,在使用Redis时,建议配置适当的连接超时时间,以确保连接资源的有效管理和服务的正常运行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [设置Redis客户端连接超时时间](https://blog.csdn.net/zzchances/article/details/116223555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值