项目中要用到redis,于是尝试通过springboot整合redis,redis集群采用3主3从,搭建方法参考:https://developer.aliyun.com/article/767317
springboot从2.x版本开始默认使用lettuce访问redis,所以部分配置由jedis改为lettuce
spring.redis.cluster.nodes=ip1:port1,ip2:port2,ip3:port3,ip4:port4,ip5:port5,ip6:port6
#spring.redis.sentinel.nodes=ip1:port1
#spring.redis.sentinel.master=mymaster
# Redis 数据库索引(默认为 0)
spring.redis.database=0
# Redis 服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
# 连接超时时间(毫秒)
#spring.redis.timeout=0 这条配置有问题,需要注释掉或者改为500ms
异常1: Cannot retrieve initial cluster partitions from initial URIs [RedisURI [host='192.168.1.1', port=6379]]
这个问题绕了很多弯路,根据网上的很多方案,以为是redis集群配置成了主从模式,但是springboot连接使用的是cluster模式,最后发现问题出在spring.redis.timeout=0这条配置上。
spring.redis.timeout,在1.0中,时间相关的配置参数类型为int,默认单位为毫秒,而且设置为0意味着不超时,2.x版本中参数类型为Duration,需要添加单位,如:500ms
异常2: java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig
添加依赖即可
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.8.0</version>
</dependency>
异常3:Caused by: io.lettuce.core.RedisCommandExecutionException: CLUSTERDOWN The cluster is down
1.如果在配置文件中给redis设置了密码,还需要在redis-cli终端设置一下
config set requirepass xxxx(密码)
2.redis-cli 检查cluster的状态
cluster info
3.配置文件中cluster-require-full-coverage设置为no,重启redis服务,可参考:https://stackoverflow.com/questions/53594257/clusterdown-the-cluster-is-down-in-redis