活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心
      文档中心

      分布式缓存服务Redis版

      分布式缓存服务Redis版

        • 产品动态
        • 产品简介
        • 产品定义
        • 应用场景
        • 实例类型
        • Redis单机实例
        • Redis主备实例
        • Redis Proxy集群实例
        • Redis Cluster集群实例
        • 读写分离实例
        • 实例规格
        • Redis3.0实例
        • Redis4.0/5.0实例
        • Redis 6.0实例
        • 开源命令兼容性
        • Redis3.0命令
        • Redis4.0命令
        • Redis5.0命令
        • Redis 6.0命令
        • Web CLI命令
        • 实例受限使用命令
        • 部分命令使用限制
        • 缓存灾备策略
        • Redis版本差异
        • 与开源服务的差异
        • 基本概念
        • 与其他服务的关系
        • 权限管理
        • 计费说明
        • 公有云计费说明
        • 产品价格
        • 计费方式
        • 计费模式
        • 专属云计费说明
        • 开通方式
        • 产品价格
        • 计费模式
        • 操作指导
        • 实例配置管理
        • 配置管理说明
        • 修改实例配置参数
        • 修改实例维护时间窗
        • 修改实例安全组
        • 查看实例后台任务
        • 查看Redis 3.0 Proxy集群实例的数据存储统计信息
        • 分析Redis实例大Key和热Key
        • 查询Redis实例慢查询
        • 管理分片与副本
        • 实例诊断
        • 监控
        • 支持的监控指标
        • 查看监控指标
        • 必须配置的告警监控
        • 实例备份恢复管理
        • 备份与恢复说明
        • 设置备份策略
        • 手动备份实例
        • 实例恢复
        • 下载实例备份文件
        • 密码管理
        • 关于实例连接密码的说明
        • 修改缓存实例密码
        • 重置缓存实例密码
        • 修改Redis实例的访问方式
        • 实例日常操作
        • 变更规格
        • 重启实例
        • 删除实例
        • 主备切换
        • 清空实例数据
        • 导出实例列表
        • 命令重命名
        • 使用DCS迁移数据
        • 使用DCS迁移介绍
        • 备份文件导入方式
        • 备份文件导入方式-OBS桶
        • 备份文件导入方式-Redis实例
        • 在线迁移方式
        • 实例交换IP
        • 审计
        • 服务支持的DCS操作列表
        • 查看云审计日志
        • 权限管理
        • 参数模板
        • 查看参数模板信息
        • 创建自定义参数模板
        • 修改自定义参数模板
        • 删除自定义参数模板
        • 数据迁移指南
        • 概述
        • 迁移流程介绍
        • 迁移方案概览
        • 自建Redis迁移至DCS
        • 使用在线迁移自建Redis
        • 使用备份文件迁移自建Redis
        • 使用Redis-cli迁移自建Redis(AOF文件)
        • 使用Redis-cli迁移自建Redis(RDB文件)
        • 使用Redis-Shake工具迁移自建Redis Cluster集群
        • DCS实例间迁移
        • 使用在线迁移Redis实例
        • 使用备份文件迁移不同Region/Redis版本的实例
        • 其他云厂商Redis服务迁移至DCS
        • 使用在线迁移其他云厂商Redis
        • 使用备份文件迁移其他云厂商Redis
        • 使用Rump在线迁移
        • 使用Redis-Shake工具离线迁移其他云厂商Redis Cluster集群
        • 使用Redis-shake工具在线全量迁移其他云厂商Redis
        • DCS实例迁移下云
        • 快速入门
        • 创建实例
        • 创建前准备
        • 准备实例依赖资源
        • 创建Redis实例
        • 连接实例
        • 使用Redis-cli连接Redis实例
        • 多语言连接
        • Java客户端
        • Jedis
        • Lettuce
        • Redisson
        • SpringBoot集成Lettuce
        • Python Redis客户端
        • Go Redis客户端
        • C++Redis客户端(hiredis)
        • C# Redis客户端
        • PHP客户端
        • Node.js Redis客户端
        • 控制台连接Redis4.0/5.0/6.0实例
        • 查看实例信息
        • 最佳实践
        • redis常见使用规范
        • 使用Nginx实现公网访问Redis 4.0/5.0的单机主备Proxy集群实例
        • 使用SSH隧道代理机制实现公网访问DCS实例
        • 使用Redis实现排行榜功能
        • 常见问题
        • 实例类型/版本
        • 客户端和网络连接
        • Redis使用
        • Redis命令
        • 扩容缩容与实例升级
        • 监控告警
        • 数据备份/导出
        • 大Key/热Key分析
        • 主备倒换
        • 故障排除
        • Redis连接失败问题排查和解决
        • Redis实例CPU使用率高问题排查和解决
        • Redis实例内存使用率高问题排查和解决
        • 排查Redis实例带宽使用率高的问题
        • 数据迁移失败问题排查
        • 视频专区
        • 相关协议
        • 天翼云分布式缓存服务协议
        • 分布式缓存服务Redis服务等级协议
        • 文档下载
          无相关产品

          本页目录

          帮助中心分布式缓存服务Redis版快速入门连接实例多语言连接Java客户端Lettuce
          Lettuce
          更新时间 2023-11-02 17:55:27
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2023-11-02 17:55:27
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          本章介绍使用同一VPC内弹性云主机ECS上的Lettuce连接Cluster集群的方法。

          介绍使用同一VPC内弹性云主机ECS上的Lettuce连接Redis实例的方法。更多的客户端的使用方法请参考Redis客户端。

          在springboot类型的项目中,spring-data-redis中已提供了对jedis、lettuce的集成适配。另外,在springboot1.x中默认集成的是jedis,springboot2.x中改为了lettuce,因此在springboot2.x及更高版本中想集成使用jedis,无需手动引入lettuce依赖包。

          前提条件

          • 已成功申请Redis实例,且状态为“运行中”。
          • 查看并获取待连接Redis实例的IP地址和端口。

          具体步骤请参见查看实例信息。

          • 已创建弹性云主机,创建弹性云主机的方法,请参见《弹性云主机用户指南》。
          • 如果弹性云主机为Linux系统,该弹性云主机必须已经安装java编译环境。

          Pom配置

          <!-- 引入spring-data-redis组件,默认已集成lettuce依赖SDK --> 
          <dependency> 
              <groupId>org.springframework.boot</groupId> 
              <artifactId>spring-boot-starter-data-redis</artifactId> 
          </dependency>
          

          基于application.properties配置

          单机、主备、读写分离、Proxy集群实例配置

          #redis host 
          spring.redis.host=<host> 
          #redis 端口号 
          spring.redis.port=<port> 
          #redis 数据库下标 
          spring.redis.database=0 
          #redis 密码 
          spring.redis.password=<password> 
          #redis 读写超时 
          spring.redis.timeout=2000
          
          • Cluster集群实例配置
          # redis cluster节点信息 
          spring.redis.cluster.nodes=<ip:port>,<ip:port>,<ip:port> 
          # redis cluster 最大重定向次数 
          spring.redis.cluster.max-redirects=3 
          # redis cluster 节点密码 
          spring.redis.password=<password> 
          # redis cluster 超时配置 
          spring.redis.timeout=2000 
          # 开启自适应拓扑刷新 
          spring.redis.lettuce.cluster.refresh.adaptive=true 
          # 开启每10S定时刷新拓扑结构 
          spring.redis.lettuce.cluster.refresh.period=10S
          

          基于Bean方式配置

          • 单机、主备、读写分离、Proxy集群实例配置
          # redis cluster节点信息 
          spring.redis.cluster.nodes=<ip:port>,<ip:port>,<ip:port> 
          # redis cluster 最大重定向次数 
          spring.redis.cluster.max-redirects=3 
          # redis cluster 节点密码 
          spring.redis.password=<password> 
          # redis cluster 超时配置 
          spring.redis.timeout=2000 
          # 开启自适应拓扑刷新 
          spring.redis.lettuce.cluster.refresh.adaptive=true 
          # 开启每10S定时刷新拓扑结构 
          spring.redis.lettuce.cluster.refresh.period=10S
          
          • 单机、主备、读写分离、Proxy集群实例池化配置

          引入池化组件

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

          代码配置

          import java.time.Duration; 
           
          import org.apache.commons.pool2.impl.GenericObjectPoolConfig; 
          import org.springframework.beans.factory.annotation.Value; 
          import org.springframework.context.annotation.Bean; 
          import org.springframework.context.annotation.Configuration; 
          import org.springframework.data.redis.connection.RedisConnectionFactory; 
          import org.springframework.data.redis.connection.RedisStandaloneConfiguration; 
          import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; 
          import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; 
          import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; 
           
          import io.lettuce.core.ClientOptions; 
          import io.lettuce.core.SocketOptions; 
           
          /** 
          * Lettuce 池化配置 
          */ 
          @Configuration 
          public class RedisPoolConfiguration { 
              @Value("${redis.host}") 
              private String redisHost; 
           
              @Value("${redis.port:6379}") 
              private Integer redisPort = 6379; 
           
              @Value("${redis.database:0}") 
              private Integer redisDatabase = 0; 
           
              @Value("${redis.password:}") 
              private String redisPassword; 
           
              @Value("${redis.connect.timeout:2000}") 
              private Integer redisConnectTimeout = 2000; 
           
              @Value("${redis.read.timeout:2000}") 
              private Integer redisReadTimeout = 2000; 
           
              @Value("${redis.pool.minSize:50}") 
              private Integer redisPoolMinSize = 50; 
           
              @Value("${redis.pool.maxSize:200}") 
              private Integer redisPoolMaxSize = 200; 
           
              @Value("${redis.pool.maxWaitMillis:2000}") 
              private Integer redisPoolMaxWaitMillis = 2000; 
           
              @Value("${redis.pool.softMinEvictableIdleTimeMillis:1800000}") 
              private Integer redisPoolSoftMinEvictableIdleTimeMillis = 30 * 60 * 1000; 
           
              @Value("${redis.pool.timeBetweenEvictionRunsMillis:60000}") 
              private Integer redisPoolBetweenEvictionRunsMillis = 60 * 1000; 
           
              @Bean 
              public RedisConnectionFactory redisConnectionFactory(LettuceClientConfiguration clientConfiguration) { 
           
                  RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration(); 
                  standaloneConfiguration.setHostName(redisHost); 
                  standaloneConfiguration.setPort(redisPort); 
                  standaloneConfiguration.setDatabase(redisDatabase); 
                  standaloneConfiguration.setPassword(redisPassword); 
           
                  LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(standaloneConfiguration, clientConfiguration); 
                  connectionFactory.setDatabase(redisDatabase); 
                  //关闭共享链接,才能池化生效 
                  connectionFactory.setShareNativeConnection(false); 
                  return connectionFactory; 
              } 
           
              @Bean 
              public LettuceClientConfiguration clientConfiguration() { 
           
                  SocketOptions socketOptions = SocketOptions.builder().connectTimeout(Duration.ofMillis(redisConnectTimeout)).build(); 
           
                  ClientOptions clientOptions = ClientOptions.builder() 
                          .autoReconnect(true) 
                          .pingBeforeActivateConnection(true) 
                          .cancelCommandsOnReconnectFailure(false) 
                          .disconnectedBehavior(ClientOptions.DisconnectedBehavior.ACCEPT_COMMANDS) 
                          .socketOptions(socketOptions) 
                          .build(); 
           
                  LettucePoolingClientConfiguration poolingClientConfiguration = LettucePoolingClientConfiguration.builder() 
                          .poolConfig(redisPoolConfig()) 
                          .commandTimeout(Duration.ofMillis(redisReadTimeout)) 
                          .clientOptions(clientOptions) 
                          .build(); 
                  return poolingClientConfiguration; 
              } 
           
              private GenericObjectPoolConfig redisPoolConfig() { 
                  GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); 
                  //连接池的最小连接数 
                  poolConfig.setMinIdle(redisPoolMinSize); 
                  //连接池的最大空闲连接数 
                  poolConfig.setMaxIdle(redisPoolMaxSize); 
                  //连接池的最大连接数 
                  poolConfig.setMaxTotal(redisPoolMaxSize); 
                  //连接池耗尽后是否需要等待,默认true表示等待。当值为true时,setMaxWait才会生效 
                  poolConfig.setBlockWhenExhausted(true); 
                  //连接池耗尽后获取连接的最大等待时间,默认-1表示一直等待 
                  poolConfig.setMaxWait(Duration.ofMillis(redisPoolMaxWaitMillis)); 
                  //创建连接时校验有效性(ping),默认false 
                  poolConfig.setTestOnCreate(false); 
                  //获取连接时校验有效性(ping),默认false,业务量大时建议设置为false减少开销 
                  poolConfig.setTestOnBorrow(true); 
                  //归还连接时校验有效性(ping),默认false,业务量大时建议设置为false减少开销 
                  poolConfig.setTestOnReturn(false); 
                  //是否开启空闲连接检测,如为false,则不剔除空闲连接 
                  poolConfig.setTestWhileIdle(true); 
                  //禁止最小空闲时间关闭连接 
                  poolConfig.setMinEvictableIdleTime(Duration.ofMillis(-1)); 
                  //连接空闲多久后逐出,当空闲时间>该值,并且空闲连接>最大空闲数时直接逐出 
                  poolConfig.setSoftMinEvictableIdleTime(Duration.ofMillis(redisPoolSoftMinEvictableIdleTimeMillis)); 
                  //关闭根据MinEvictableIdleTimeMillis判断逐出 
                  poolConfig.setMinEvictableIdleTime(Duration.ofMillis(-1)); 
                  //空闲连接逐出的检测周期,默认为60s 
                  poolConfig.setTimeBetweenEvictionRuns(Duration.ofMillis(redisPoolBetweenEvictionRunsMillis)); 
                  return poolConfig; 
              } 
          }
          
          • Cluster集群实例配置
            import java.time.Duration; 
            import java.util.ArrayList; 
            import java.util.List; 
            
            import org.springframework.beans.factory.annotation.Value; 
            import org.springframework.context.annotation.Bean; 
            import org.springframework.context.annotation.Configuration; 
            import org.springframework.data.redis.connection.RedisClusterConfiguration; 
            import org.springframework.data.redis.connection.RedisConnectionFactory; 
            import org.springframework.data.redis.connection.RedisNode; 
            import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; 
            import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; 
            
            import io.lettuce.core.ClientOptions; 
            import io.lettuce.core.SocketOptions; 
            import io.lettuce.core.cluster.ClusterClientOptions; 
            import io.lettuce.core.cluster.ClusterTopologyRefreshOptions; 
            
            /** 
            * Lettuce Cluster 非池化配置,与 application.properties 配置方式二选一 
            */ 
            @Configuration 
            public class RedisConfiguration { 
            
                @Value("${redis.cluster.nodes}") 
                private String redisClusterNodes; 
            
                @Value("${redis.cluster.maxDirects:3}") 
                private Integer redisClusterMaxDirects; 
            
                @Value("${redis.password:}") 
                private String redisPassword; 
            
                @Value("${redis.connect.timeout:2000}") 
                private Integer redisConnectTimeout = 2000; 
            
                @Value("${redis.read.timeout:2000}") 
                private Integer redisReadTimeout = 2000; 
            
                @Value("${redis.cluster.topology.refresh.period.millis:10000}") 
                private Integer redisClusterTopologyRefreshPeriodMillis = 10000; 
            
                @Bean 
                public RedisConnectionFactory redisConnectionFactory(LettuceClientConfiguration clientConfiguration) { 
            
                    RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(); 
            
                    List<RedisNode> clusterNodes = new ArrayList<>(); 
                    for (String clusterNodeStr : redisClusterNodes.split(",")) { 
                        String[] nodeInfo = clusterNodeStr.split(":"); 
                        clusterNodes.add(new RedisNode(nodeInfo[0], Integer.valueOf(nodeInfo[1]))); 
                    } 
                    clusterConfiguration.setClusterNodes(clusterNodes); 
            
                    clusterConfiguration.setPassword(redisPassword); 
                    clusterConfiguration.setMaxRedirects(redisClusterMaxDirects); 
            
                    LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfiguration, clientConfiguration); 
                    return connectionFactory; 
                } 
            
                @Bean 
                public LettuceClientConfiguration clientConfiguration() { 
            
                    SocketOptions socketOptions = SocketOptions.builder().connectTimeout(Duration.ofMillis(redisConnectTimeout)).build(); 
            
                    ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() 
                            .enableAllAdaptiveRefreshTriggers() 
                            .enablePeriodicRefresh(Duration.ofMillis(redisClusterTopologyRefreshPeriodMillis)) 
                            .build(); 
            
                    ClusterClientOptions clientOptions = ClusterClientOptions.builder() 
                            .autoReconnect(true) 
                            .pingBeforeActivateConnection(true) 
                            .cancelCommandsOnReconnectFailure(false) 
                            .disconnectedBehavior(ClientOptions.DisconnectedBehavior.ACCEPT_COMMANDS) 
                            .socketOptions(socketOptions) 
                            .topologyRefreshOptions(topologyRefreshOptions) 
                            .build(); 
            
                    LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder() 
                            .commandTimeout(Duration.ofMillis(redisReadTimeout)) 
                            .clientOptions(clientOptions) 
                            .build(); 
                    return clientConfiguration; 
                } 
            }
            
          • Cluster实例池化配置

          引入池化组件

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

          代码配置

          import java.time.Duration; 
          import java.util.ArrayList; 
          import java.util.List; 
           
          import org.apache.commons.pool2.impl.GenericObjectPoolConfig; 
          import org.springframework.beans.factory.annotation.Value; 
          import org.springframework.context.annotation.Bean; 
          import org.springframework.context.annotation.Configuration; 
          import org.springframework.data.redis.connection.RedisClusterConfiguration; 
          import org.springframework.data.redis.connection.RedisConnectionFactory; 
          import org.springframework.data.redis.connection.RedisNode; 
          import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; 
          import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; 
          import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; 
           
          import io.lettuce.core.ClientOptions; 
          import io.lettuce.core.SocketOptions; 
          import io.lettuce.core.cluster.ClusterClientOptions; 
          import io.lettuce.core.cluster.ClusterTopologyRefreshOptions; 
           
          /** 
          * Lettuce 池化配置 
          */ 
          @Configuration 
          public class RedisPoolConfiguration { 
           
              @Value("${redis.cluster.nodes}") 
              private String redisClusterNodes; 
           
              @Value("${redis.cluster.maxDirects:3}") 
              private Integer redisClusterMaxDirects; 
           
              @Value("${redis.password:}") 
              private String redisPassword; 
           
              @Value("${redis.connect.timeout:2000}") 
              private Integer redisConnectTimeout = 2000; 
           
              @Value("${redis.read.timeout:2000}") 
              private Integer redisReadTimeout = 2000; 
           
              @Value("${redis.cluster.topology.refresh.period.millis:10000}") 
              private Integer redisClusterTopologyRefreshPeriodMillis = 10000; 
           
              @Value("${redis.pool.minSize:50}") 
              private Integer redisPoolMinSize = 50; 
           
              @Value("${redis.pool.maxSize:200}") 
              private Integer redisPoolMaxSize = 200; 
           
              @Value("${redis.pool.maxWaitMillis:2000}") 
              private Integer redisPoolMaxWaitMillis = 2000; 
           
              @Value("${redis.pool.softMinEvictableIdleTimeMillis:1800000}") 
              private Integer redisPoolSoftMinEvictableIdleTimeMillis = 30 * 60 * 1000; 
           
              @Value("${redis.pool.timeBetweenEvictionRunsMillis:60000}") 
              private Integer redisPoolBetweenEvictionRunsMillis = 60 * 1000; 
           
              @Bean 
              public RedisConnectionFactory redisConnectionFactory(LettuceClientConfiguration clientConfiguration) { 
           
                  RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(); 
           
                  List<RedisNode> clusterNodes = new ArrayList<>(); 
                  for (String clusterNodeStr : redisClusterNodes.split(",")) { 
                      String[] nodeInfo = clusterNodeStr.split(":"); 
                      clusterNodes.add(new RedisNode(nodeInfo[0], Integer.valueOf(nodeInfo[1]))); 
                  } 
                  clusterConfiguration.setClusterNodes(clusterNodes); 
           
                  clusterConfiguration.setPassword(redisPassword); 
                  clusterConfiguration.setMaxRedirects(redisClusterMaxDirects); 
           
                  LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfiguration, clientConfiguration); 
                  //一定要关闭共享连接,否则连接池将不会生效 
                  connectionFactory.setShareNativeConnection(false); 
                  return connectionFactory; 
              } 
           
              @Bean 
              public LettuceClientConfiguration clientConfiguration() { 
           
                  SocketOptions socketOptions = SocketOptions.builder().connectTimeout(Duration.ofMillis(redisConnectTimeout)).build(); 
           
                  ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() 
                          .enableAllAdaptiveRefreshTriggers() 
                          .enablePeriodicRefresh(Duration.ofMillis(redisClusterTopologyRefreshPeriodMillis)) 
                          .build(); 
           
                  ClusterClientOptions clientOptions = ClusterClientOptions.builder() 
                          .autoReconnect(true) 
                          .pingBeforeActivateConnection(true) 
                          .cancelCommandsOnReconnectFailure(false) 
                          .disconnectedBehavior(ClientOptions.DisconnectedBehavior.ACCEPT_COMMANDS) 
                          .socketOptions(socketOptions) 
                          .topologyRefreshOptions(topologyRefreshOptions) 
                          .build(); 
           
                  LettucePoolingClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder() 
                          .poolConfig(poolConfig()) 
                          .commandTimeout(Duration.ofMillis(redisReadTimeout)) 
                          .clientOptions(clientOptions) 
                          .build(); 
                  return clientConfiguration; 
              } 
           
              private GenericObjectPoolConfig poolConfig() { 
                  GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); 
                  //连接池的最小连接数 
                  poolConfig.setMinIdle(redisPoolMinSize); 
                  //连接池的最大空闲连接数 
                  poolConfig.setMaxIdle(redisPoolMaxSize); 
                  //连接池的最大连接数 
                  poolConfig.setMaxTotal(redisPoolMaxSize); 
                  //连接池耗尽后是否需要等待, 默认true表示等待. 当值为true时, setMaxWait才会生效 
                  poolConfig.setBlockWhenExhausted(true); 
                  //连接池耗尽后获取连接的最大等待时间, 默认-1表示一直等待 
                  poolConfig.setMaxWait(Duration.ofMillis(redisPoolMaxWaitMillis)); 
                  //创建连接时校验有效性(ping),默认false 
                  poolConfig.setTestOnCreate(false); 
                  //获取连接时校验有效性(ping), 默认false, 业务量大时建议设置为false减少开销 
                  poolConfig.setTestOnBorrow(true); 
                  //归还连接时校验有效性(ping),默认false, 业务量大时建议设置为false减少开销 
                  poolConfig.setTestOnReturn(false); 
                  //是否开启空闲连接检测,如为false,则不剔除空闲连接 
                  poolConfig.setTestWhileIdle(true); 
                  //禁止最小空闲时间关闭连接 
                  poolConfig.setMinEvictableIdleTime(Duration.ofMillis(-1)); 
                  //连接空闲多久后逐出,当空闲时间>该值,并且空闲连接>最大空闲数时直接逐出,不再根据MinEvictableIdleTimeMillis判断(默认逐出策略) 
                  poolConfig.setSoftMinEvictableIdleTime(Duration.ofMillis(redisPoolSoftMinEvictableIdleTimeMillis)); 
                  //空闲连接逐出的检测周期,默认为60s 
                  poolConfig.setTimeBetweenEvictionRuns(Duration.ofMillis(redisPoolBetweenEvictionRunsMillis)); 
           
                  return poolConfig; 
              } 
           
          }
          

          参数明细

          LettuceConnectionFactory参数

          参数 类型 默认值 说明
          configuration RedisConfiguration - redis连接配置,常用两个子类:
          RedisStandaloneConfiguration
          RedisClusterConfiguration
          clientConfiguration LettuceClientConfiguration - 客户端配置参数,常用子类:LettucePoolingClientConfiguration(用于池化)
          shareNativeConnection boolean true 是否采用共享连接,默认true,采用连接池时必须设置为false

          RedisStandaloneConfiguration参数

          参数 默认值 说明
          hostName localhost 连接Redis实例的IP地址
          port 6379 连接端口号
          database 0 数据库下标
          password - 连接密码

          RedisClusterConfiguration参数

          参数 说明
          clusterNodes cluster节点连接信息,需IP、Port
          maxRedirects cluster访问最大重定向次数,建议值:3
          password 连接密码

          LettuceClientConfiguration参数

          参数 类型 默认值 说明
          timeout Duration 60s 命令超时时间配置,建议值:2s
          clientOptions ClientOptions - 配置项

          LettucePoolingClientConfiguration参数

          参数 类型 默认值 说明
          timeout Duration 60s 命令超时时间配置,建议值:2s
          clientOptions ClientOptions - 配置项
          poolConfig GenericObjectPoolConfig - 连接池配置

          ClientOptions参数

          参数 类型 默认值 说明
          autoReconnect boolean true 连接断开后,是否自动发起重连,建议值:true
          pingBeforeActivateConnection boolean true 连接创建后,是否通过ping/pong校验连接可用性,建议值:true
          cancelCommandsOnReconnectFailure boolean true 连接重连失败时,是否取消队列中的命令,建议值:false
          disconnectedBehavior DisconnectedBehavior DisconnectedBehavior.DEFAULT 连接断开时的行为,建议值:ACCEPT_COMMANDS
          DEFAULT:当autoReconnect为true时,允许命令进入队列等待,当autoReconnect为false时,禁止命令进入队列等待
          ACCPET_COMMANDS:允许命令进入队列等待
          REJECT_COMMANDS:禁止命令进入队列等待
          socketOptions SocketOptions - 网络配置项

          SocketOptions参数

          参数 默认值 说明
          connectTimeout 10s 连接超时时间配置,建议值:2s

          GenericObjectPoolConfig参数

          参数 默认值 说明
          minIdle - 连接池的最小连接数
          maxIdle - 连接池的最大空闲连接数
          maxTotal - 连接池的最大连接数
          blockWhenExhausted true 连接池耗尽后是否需要等待,默认true表示等待。当值为true时,设置maxWaitMillis才会生效
          maxWaitMillis -1 连接池耗尽后获取连接的最大等待时间,默认-1表示一直等待
          testOnCreate false 创建连接时校验有效性(ping),默认false
          testOnBorrow false 获取连接时校验有效性(ping),默认false,业务量大时建议设置为false减少开销
          testOnReturn false 归还连接时校验有效性(ping),默认false,业务量大时建议设置为false减少开销
          testWhileIdle false 是否开启空闲连接检测,如为false,则不剔除空闲连接,建议值:true
          softMinEvictableIdleTimeMillis 1800000 连接空闲多久后逐出,(空闲时间>该值 && 空闲连接>最大空闲数)时直接逐出
          minEvictableIdleTimeMillis 60000 根据minEvictableIdleTimeMillis判断逐出,建议值:-1 ,关闭该策略,改用softMinEvictableIdleTimeMillis策略
          timeBetweenEvictionRunsMillis 60000 空闲连接逐出的检测周期,单位:毫秒

          DCS实例配置建议

          • 连接池化

          因lettuce底层采用基于netty的NIO模式,和redis server进行通信,不同于jedis的BIO模式。底层采用长连接 + 队列的组合模式,借助TCP顺序发、顺序收的特性,来实现同时处理多请求发送和多响应接收,单条连接可支撑的QPS在3K~5K不等,线上系统建议不要超过3K。lettuce本身不支持池化,且在springboot中默认不开启池化,如需开启池化,需通过手动引入commons-pool2组件,并关闭LettuceConnectionFactory.shareNativeConnection(共享连接)来实现池化。

          因每条lettuce连接默认需要配置两个线程池-I/O thread pools、computation thread pool,用于支撑IO事件读取和异步event处理,如配置成连接池形式使用,每个连接都将会创建两个线程池,对内存资源的占用偏高。鉴于lettuce的底层模型实现,及单连接突出的处理能力,不建议通过池化的方式使用lettuce。

          • 拓扑刷新

          在连接cluster类型实例中,lettuce会在初始化时,向配置的节点列表随机发送cluster nodes来获取集群slot的分布信息。如后续cluster扩/缩容、主备切换等,会导致集群拓扑结构发生变化, lettuce默认是不感知的,需手动开启主动感知拓扑结构变化, 如下:

          − 基于application.properties配置

          # 开启自适应拓扑刷新 
          spring.redis.lettuce.cluster.refresh.adaptive=true 
          # 开启每10s定时刷新拓扑结构 
          spring.redis.lettuce.cluster.refresh.period=10S
          

          − 基于API配置

          ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() 
              .enableAllAdaptiveRefreshTriggers() 
              .enablePeriodicRefresh(Duration.ofMillis(redisClusterTopologyRefreshPeriodMillis)) 
              .build(); 
           
          ClusterClientOptions clientOptions = ClusterClientOptions.builder() 
                  ... 
                  ... 
                  .topologyRefreshOptions(topologyRefreshOptions) 
                  .build();
          
          • 爆炸半径

          因lettuce底层采用的是单长连接 + 请求队列的组合模式,一旦遇到网络抖动/请求,或连接失活,将影响所有请求,尤其是在连接失活场景中,将尝试tcp重传,直至重传超时关闭连接,待连接重建后才能恢复。在重传期间请求队列会不断堆积请求,上层业务非常容易出现批量超时,甚至在部分操作系统内核中的重传超时配置过长,致使业务系统长时间处于不可用状态。因此, 不推荐使用lettuce组件,建议用jedis组件替换 。

          文档反馈

          建议您登录后反馈,可在建议与反馈里查看问题处理进度

          鼠标选中文档,精准反馈问题

          选中存在疑惑的内容,即可快速反馈问题,我们会跟进处理

          知道了

          上一篇 :  Jedis
          下一篇 :  Redisson
          搜索 关闭
          ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
          公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
          备案 京公网安备11010802043424号 京ICP备 2021034386号
          ©2025天翼云科技有限公司版权所有
          京ICP备 2021034386号
          备案 京公网安备11010802043424号
          增值电信业务经营许可证A2.B1.B2-20090001
          用户协议 隐私政策 法律声明