Spring Boot 3.X:Unable to connect to Redis错误记录

一.背景

最近在搭建一个新项目,本着有新用新的原则,项目选择到了jdk17+SpringBoot3.4。但是在测试Redis连接的时候却遇到了以下问题:

redis连不上了。于是我先去检查了配置文件的连接信息,发现没问题;再去检查配置类:

也没发现问题。并且我去启动了以前用SpringBoot2.X的老项目,发现同样的配置下,以前的老项目就能成功连上Redis。那这下就大概可以确定原因了:SpringBoot3.4版本下,引用的spring-boot-starter-data-redis可能有点毛病。

二.发现问题

1.问题发现

既然可能是版本问题,那就只能去github上看看了

果然也有其它人遇到了相同的问题,不过还好这个问题已经被解决了

翻译一下就是:

Lettuce驱动程序版本在Spring Data和Spring Boot版本之间发生了变化,这些版本改变了握手行为。我建议您通过clientOptions.builder(). protocolversion (ProtocolVersion.RESP2).build()来配置LettuceClientConfiguration.clientOptions,来强制RESP2处理,这样你就不会遇到HELLO错误,并且将使用AUTH命令来应用身份验证。

看起来Lettuce客户端已经通过redis/ Lettuce #3035修复了6.5版本的问题。

在任何情况下,这都是驱动程序的问题。

据此可以得到两种解决方案:

(1)手动配置LettuceClientConfiguration.clientOptions的protocolversion

(2)将Lettuce升级到6.5

2.问题验证

我的“spring-boot-starter-data-redis”版本是跟着springboot版本走的,也就是3.4.0

接下来看一下“spring-boot-starter-data-redis”提供的lettuce依赖

可以看,到lettuce依赖版本默认是6.4.1,而不是已经解决bug的6.5。接下来对程序debug验证一下lettuce版本为6.4.1时,LettuceClientConfiguration.clientOptions的protocolversion

可以看到,Spring为我们自动配置的RedisConnectionFactory中,clientOptions的protocolVersion属性为null,没有被设置为RESP2。

三.解决方案

1.手动配置LettuceClientConfiguration.clientOptions的protocolversion

我们不使用Spring为我们自动配置的RedisConnectionFactory,而是自己配置一个LettuceConnectionFactory交给IOC容器管理。在配置LettuceConnectionFactory时通过配置ClientOptions的protocolVersion为RESP2,来解决连接bug。

(1)配置代码

自己配置LettuceConnectionFactory的话还需要引入外部连接池依赖

        <dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>

    /**
     * 配置线程池连接工厂LettuceConnectionFactory
     * @return
     */
    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory(){
        // redis配置
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(host, port);
        redisStandaloneConfiguration.setDatabase(dataBase);
        redisStandaloneConfiguration.setPassword(password);

        // 连接池配置
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setMinIdle(minIdle);
        genericObjectPoolConfig.setMaxIdle(maxIdle);
        genericObjectPoolConfig.setMaxWait(Duration.ofDays(maxWait));
        genericObjectPoolConfig.setMaxTotal(maxActive);

        // ClientOptions配置
        ClientOptions clientOptions = ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build();

        // redis客户端配置
        LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder
                builder =  LettucePoolingClientConfiguration
                .builder()
                .clientOptions(clientOptions)
                .commandTimeout(Duration.ofMillis(timeOut));

        builder.poolConfig(genericObjectPoolConfig);
        LettuceClientConfiguration lettuceClientConfiguration = builder.build();
        return new LettuceConnectionFactory(redisStandaloneConfiguration,lettuceClientConfiguration);
    }

(2)启动验证

可以看到此时注入进来的RedisConnectionFactory就是我们自己配置的LettuceConnectionFactory,其ClientOptions的protocolVersion属性为RESP2。Redis可以被正常连接。

2.将Lettuce升级到6.5

这种方法就比较简单粗暴了,既然“spring-boot-starter-data-redis”提供的lettuce依赖版本为6.4,那我们就不用它提供的了,自己引入版本为6.5的lettuce依赖。

(1)配置代码

        <!--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>
		<!--lettuce-->
		<dependency>
			<groupId>io.lettuce</groupId>
			<artifactId>lettuce-core</artifactId>
			<version>${lettuce.version}</version>
		</dependency>
		<!--外部连接池-->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>

其中lettuce.version是6.5.0.RELEASE。最下面的“commons-pool2”是如果要自己配置LettuceConnectionFactory才需要引入,也就是方案一要用到,这里没有删掉。

(2)启动验证

IOC容器中的Spring为我们自动配置的RedisConnectionFactory的clientOptions.protocolVersion仍然是null,但是此时Redis已经可以正常连接上了,说明Lettuce 6.5.0已经解决了认证连接bug。

<think>好的,我现在需要帮助用户解决Spring Data Redis连接失败的问题,具体是无法连接到127.0.0.2:6379。首先,我得回忆一下常见的Redis连接问题可能有哪些原因,然后结合用户提供的引用内容来分析。 首先,用户提到的错误信息是`RedisConnectionFailureException: Unable to connect to 127.0.0.2:6379`。根据引用[1]和引用[3],这类问题通常与网络配置或Redis服务器配置有关。用户之前可能尝试连接到不同的IP,比如127.0.0.1,现在改成了127.0.0.2,所以需要检查这个IP是否配置正确。 接下来,我需要考虑几个方面: 1. **网络连通性**:检查应用是否能访问127.0.0.2:6379。可能用户误将IP设为127.0.0.2,而Redis实际上监听的是127.0.0.1或0.0.0.0。这时候使用telnet或redis-cli测试连接会有帮助。 2. **Redis配置**:查看redis.conf文件中的bind和protected-mode设置。根据引用[3],bind参数决定了允许连接的IP地址。如果bind没有包含127.0.0.2,或者protected-mode是yes而没有设置密码,可能导致连接被拒绝。 3. **应用配置**:检查application.yml中的host、port、password和timeout是否正确。引用[2]提到需要正确配置这些参数,尤其是host和password。 4. **防火墙或安全组**:虽然用户可能是在本地测试,但如果是在服务器环境,需要确认6379端口是否开放。不过这里IP是127.0.0.2,属于本地回环地址,可能不涉及外部防火墙,但可能存在本地防火墙规则。 5. **Redis服务状态**:确认Redis是否正在运行,并且监听正确的地址和端口。使用`netstat -tuln`可以查看端口监听情况。 然后,逐步分析每个可能性。首先,用户应该确认Redis服务器是否在127.0.0.2上监听。默认情况下,Redis绑定127.0.0.1,所以如果用户修改了bind为127.0.0.2,或者配置了多个IP,可能需要调整。如果bind设置为127.0.0.1,那么尝试连接127.0.0.2会失败,因为该IP不在允许的列表中。 另外,检查protected-mode是否为yes且没有设置密码,这会导致即使本地连接也需要认证。引用[2]提到需要配置密码,所以用户可能需要检查application.yml中的password是否正确,或者Redis是否配置了requirepass。 可能用户错误地将host配置为127.0.0.2,而Redis实际上在127.0.0.1上运行,或者根本没有绑定到该地址。这时候需要修改Redis配置或应用的host设置。 总结解决步骤: 1. 检查应用配置中的host是否为正确的Redis服务器IP。 2. 确认Redis的bind配置包含应用尝试连接的IP(127.0.0.2)。 3. 关闭protected-mode或设置密码,并确保应用配置中的密码正确。 4. 测试网络连通性,使用telnet或redis-cli连接。 5. 确保Redis服务正在运行,并监听正确的端口。 用户可能需要依次排查这些方面,逐步确定问题所在。例如,先测试能否用redis-cli连接到127.0.0.2:6379,如果失败,说明问题在Redis配置或服务状态;如果成功,再检查应用配置或密码问题。</think>### Redis连接失败问题解决方案(127.0.0.2:6379) #### 一、基础检查步骤 1. **确认Redis服务状态** 通过命令检查Redis是否运行并监听目标地址: ```bash netstat -tuln | grep 6379 ``` 若输出未包含`127.0.0.2:6379`,说明Redis未正确绑定该地址[^3]。 2. **验证网络连通性** 使用`telnet`或`redis-cli`测试连接: ```bash telnet 127.0.0.2 6379 # 若返回"Connected"表示网络正常 redis-cli -h 127.0.0.2 -p 6379 ping # 返回"PONG"表示连接成功 ``` --- #### 二、配置修正方向 1. **Redis服务器配置(redis.conf)** - **修改绑定地址**:添加`bind 127.0.0.2`或`bind 0.0.0.0`(允许所有IP连接)[^3] - **关闭保护模式**:`protected-mode no` - **设置密码**:`requirepass yourpassword`(需与Spring配置匹配) 修改后重启Redis服务。 2. **Spring Boot应用配置(application.yml)** 确保配置与Redis服务一致: ```yaml spring: redis: host: 127.0.0.2 port: 6379 password: yourpassword # 与redis.conf中requirepass一致 timeout: 5000 ``` --- #### 三、进阶排查 1. **防火墙/SELinux检查** 本地回环地址(127.0.0.x)通常不受防火墙限制,但在Linux系统中需确认: ```bash iptables -L -n | grep 6379 # 检查端口是否被拦截 getenforce # 若为Enforcing,尝试临时关闭SELinux:setenforce 0 ``` 2. **Redis日志分析** 查看Redis日志定位拒绝连接的原因: ```bash tail -f /var/log/redis/redis-server.log ``` --- #### 四、常见问题示例 - **错误配置**:若`redis.conf`中仅配置`bind 127.0.0.1`,连接`127.0.0.2`会被拒绝[^3] - **密码不匹配**:Spring中配置的`password`需与`requirepass`完全一致(包括空格)[^2] - **超时设置过短**:复杂操作时建议`timeout`不低于5000ms[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值