Redis连接池Lettuce踩坑记录

Posted 曹辰的思考笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis连接池Lettuce踩坑记录相关的知识,希望对你有一定的参考价值。

大白天踩坑 Lettuce

一、引言

  近期项目频繁部署不同测试环境,在搭建运行环境与部署项目过程中踩到了不少Redis的坑。项目是基于SpringBoot2.1.12,SpringBoot2.1.X集成jar包Spring-data-redis-start 使用Lettuce作为Redis连接池。

  • SpringBoot1.x默认采用Jedis作为redis客户端连接池。

  • SpringBoot2.x,spring-data-redis 默认采用Lettuce作为redis客户端驱动连接池。

二、踩坑场景

  运行环境Redis集群中某个master节点不稳定连接不上,导致SpringBoot应用连接Redis报错,报错连接timeout。

三、解决方案

  基于Spring-data-redis重写RedisConnectionFactory Bean。需要设置“取消校验集群节点的成员关系”:.validateClusterNodeMembership(false)。

1、redis配置

spring:
redis:
cluster:
nodes:
- ${redis.host.cluster} #redis集群ip-port
password: ${redis.password}
timeout: 5000 #连接超时时间
lettuce:
pool:
max-active: 10 #连接池最大连接数
max-wait: -1 #连接池最大阻塞时间
max-idle: 5 #连接池中最大空闲连接
min-idle: 1 #连接池中最小空闲连接
redis:
cluster:
enabled: true

2、Config配置类

@Data
@Component
@ConditionalOnProperty(name = "redis.cluster.enabled", havingValue = "true", matchIfMissing = false)
public class RedisConfig {
@Autowired
RedisProperties redisProperties;

// 在构建LettuceConnectionFactory时,如果不使用内置的destroyMethod,可能会导致Redis连接早于其它Bean被销毁
@Bean(destroyMethod = "destroy")
public RedisConnectionFactory newLettuceConnectionFactory() {
// 配置用于开启自适应刷新和定时刷新。如自适应刷新不开启,Redis集群变更时将会导致连接异常
ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
.enablePeriodicRefresh(Duration.ofSeconds(60))// 开启周期刷新(默认60秒)
.enableAdaptiveRefreshTriggers(RefreshTrigger.ASK_REDIRECT,RefreshTrigger.UNKNOWN_NODE)// 开启自适应刷新
.build();
ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
.topologyRefreshOptions(clusterTopologyRefreshOptions)//拓扑刷新
.disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
.autoReconnect(true)
.socketOptions(SocketOptions.builder().keepAlive(true).build())
                 .validateClusterNodeMembership(false)// 取消校验集群节点的成员关系
.build();
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.clientOptions(clusterClientOptions)
.readFrom(ReadFrom.SLAVE_PREFERRED)
.build();
return new LettuceConnectionFactory(getClusterConfiguration(), clientConfig);
}

private RedisClusterConfiguration getClusterConfiguration() {
RedisProperties.Cluster clusterProperties = redisProperties.getCluster();
RedisClusterConfiguration config = new RedisClusterConfiguration(clusterProperties.getNodes());
if (clusterProperties.getMaxRedirects() != null) {
config.setMaxRedirects(clusterProperties.getMaxRedirects());
}
if (redisProperties.getPassword() != null) {
config.setPassword(RedisPassword.of(redisProperties.getPassword()));
}
return config;
}

}

注意:

RedisClusterConfiguration getClusterConfiguration()需要设置Password,不然SpringBoot启动报认证错误:
“io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required”。如下:

 另外,lettuce-core jar包版本不能过低,避免部分配置项无法支持,以上配置为lettuce-core-5.18.RELEASE.jar



香港脚 台湾人


欢迎关注,我的微信公共号

分享也是一种生活态度
                分享所思, 所得。

                如此而已   Write By CaoChen

                我是[香港脚台湾人],这个微信公共号(summerhins)的定位是自我提升,范围主要包括学习方法、注意力、习惯等等,同时不定期分享一些五花八门的读书笔记和影评。

                欢迎点击文章标题下方的作者关注。



  • 由于水平有限,不足和错误之处在所难免,希望大家能够批评指出。

  • 我的博客:http://www.cnblogs.com/hins/

  • 我的GitHub:https://github.com/caochenhins

  • 我的微信公共号:曹辰的思考笔记



真诚赞赏,手留余香

打赏

微信支付

 

支付宝



以上是关于Redis连接池Lettuce踩坑记录的主要内容,如果未能解决你的问题,请参考以下文章

spring boot redis Lettuce连接池

lettuce连接池很香,撸撸它的源代码

redis-lettuce连接池

基于SpringBoot2.0默认使用Redis连接池的配置操作

Jedis连接池优化

springboot整合redis