springboot2整合redis5.2.0问题排查
- 首先报错信息:
- 分析思路及对应尝试解决措施
1、开始猜测网络不通:telnet ip 6379 测试无问题
2、猜测腾讯云数据安全组访问限制:本地服务创建jedis客户端连接测试无问题public static void main(String[] args) { Jedis jedis = new Jedis("10.xxx.xxx.xxx", 6379); String ping = jedis.ping(); System.out.println(ping); }
3、配置文件数据未被读取:通过修改配置方式(连接串和单独属性)debug调试排除了这个可能性
-
连接串方式
spring: redis: url: redis://password@ip:port
-
单独属性方式
spring: redis: database: 0 host: ip port: 6379 password: password
经过调试发现正确获取了配置 4、继续根据报错信息分析,认证不通过,怀疑密码设置有问题,包含了特殊字符:通过修改密码又排除了这个可能性有些怀疑人生。。。
5、还是根据报错信息(从lettuce.core包中抛出的异常)推断问题出在lettuce上面,但具体是啥问题暂不深究:通过修改连接方式为jedis成功连接上redis服务器(排除了pom的lettuce核心包)<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>
- 最终解决方法
虽然通过更换连接客户端为jedis解决了问题,但不符合发展趋势,lettuce已成为主流redis客户端,springboot2官方推荐,因此在这个保底方案基础上继续探究。终于!!
找到解决我的问题的一篇文章,跟着他的思路发现确实是lettuce的问题,是和redis版本不兼容。系统中引入的spring-lettuce依赖包版本到6.xx了,而redis服务的版本只有5.xx。官方文档介绍lettuce6.0需要匹配redis6,其中握手协议同时支持resp2/3,6.0以下低版本的redis需要使用resp2。
最终的操作:
import io.lettuce.core.ClientOptions;
import io.lettuce.core.protocol.ProtocolVersion;
import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
/**
* @description lettuce客户端配置
* @author
*/
@Configuration
public class LettuceConfig implements LettuceClientConfigurationBuilderCustomizer {
@Override
public void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) {
clientConfigurationBuilder.clientOptions(ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build());
}
}
特别鸣谢http://t.csdn.cn/C7nSP