FEATURED · 精选文章

Redisson 配置实战:从单节点到集群的完整调优路径

发布时间 / 2026/9/5 21:46:47
来源 / 创域科博编辑部
栏目 / 资讯中心
Redisson 配置实战:从单节点到集群的完整调优路径 Redisson 配置实战从单节点到集群的完整调优路径【免费下载链接】redissonRedisson: Valkey Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redisson服务刚迁完新机房Redis 连接全线超时。翻遍文档才发现问题不在网络而在 Redisson 配置旧 YAML 写的是单节点块新机房跑的主从架构客户端根本没去发现主节点。配置方式选错参数再漂亮也是白搭。下面按部署形态拆开讲怎么配、配多少、出了问题往哪查。先选模式单节点、哨兵还是集群这一步只解决一个问题你的部署形态对应 Redisson 配置里的哪一块。三种形态在配置上互斥写错块就是能连上也白搭。拓扑适用规模是否需额外组件单节点开发、测试、轻量业务否哨兵Sentinel负责监控主从并投票切换的进程中小规模主从复制是需部署哨兵进程集群Cluster数据按 slot 分片到多主节点大规模、数据量大、需水平扩展是≥3 主 ≥3 从如果你只是本地开发或数据量小、没有高可用要求选单节点。如果你有主从复制但还没到集群规模选哨兵。如果数据量或写入量单主扛不住选集群。单机环境最短可用配置到逐项调参先把最小配置跑通再谈调参。下面的 YAML 只有两行有效内容Redisson.create之后getBucket能读写就通了singleServerConfig: address: 127.0.0.1:6379跑通之后参数分两组看。连接参数控制连不上时等多久、试几次。参数默认值作用connectTimeout10000 ms建立 TCP 连接的超时timeout3000 ms命令执行超时等响应的最长时间retryAttempts4失败重试次数retryInterval1500 ms两次重试的间隔idleConnectionTimeout10000 ms空闲连接保活超时超时后归还前探活池化参数控制同一时刻能有多少条连接。单节点场景只有普通池和订阅池pub/sub 专用连接两池。singleServerConfig: address: 127.0.0.1:6379 password: yourpassword connectionPoolSize: 32 connectionMinimumIdleSize: 16 subscriptionConnectionPoolSize: 50connectionPoolSize默认 64connectionMinimumIdleSize默认 24如果并发低于 32可以按 并发数 × 2 收敛。等价 Java 写法三行Config config new Config(); config.useSingleServer().setAddress(127.0.0.1:6379).setPassword(yourpassword); RedissonClient client Redisson.create(config);哨兵模式masterName 填错会怎样哨兵配置的坑基本集中在三个字段sentinelAddresses、masterName、scanInterval。完整写法如下sentinelServersConfig: masterName: mymaster sentinelAddresses: - 127.0.0.1:26379 - 127.0.0.1:26380 password: yourpassword scanInterval: 2000 failedSlaveReconnectionInterval: 3000masterName填错会怎样哨兵只按这个名字索引主从节点名字不对客户端问每个哨兵都得到空答案于是进入连不上主 → 重试 → 再问哨兵的死循环日志刷满连接失败业务侧全部超时。白话讲masterName不是 IP 也不是端口是哨兵进程里给这个主从组起的名在任一哨兵上执行SENTINEL masters第一个字段就是它。另外两个易错点sentinelAddresses建议至少给 2 个挂一个还能问scanInterval默认 1000 ms控制多久重新向哨兵拉一次主从拓扑主从切换后的恢复速度直接取决于它频繁切换的测试环境可以调小到 2000 以内。集群模式读写分离与连接池分开设集群模式本节改用 Java 流式 API 写和上面 YAML 对照着看。这段配置的关键不是节点列表而是读写怎么走、池子怎么分Config config new Config(); config.useClusterServers() .addNodeAddress(127.0.0.1:7000, 127.0.0.1:7001, 127.0.0.1:7002) .setReadMode(ReadMode.SLAVE) .setSubscriptionMode(SubscriptionMode.SLAVE) .setMasterConnectionPoolSize(16) .setSlaveConnectionPoolSize(32) .setMasterConnectionMinimumIdleSize(8) .setSlaveConnectionMinimumIdleSize(16) .setScanInterval(5000); RedissonClient client Redisson.create(config);四个概念拆开讲readModeSLAVE默认读请求走从节点由负载均衡策略选一个MASTER全部打主MASTER_SLAVE主从混合。读多写少的业务保持默认主节点压力会明显降下来。subscriptionMode决定 pub/sub 订阅建在哪个节点上。集群里订阅连接是独占的放从节点SLAVE可以保护主节点的连接数只有主从延迟敏感的场景才用MASTER。主从分池的理由集群下每个主、每个从各自有独立连接池masterConnectionPoolSize默认 64、slaveConnectionPoolSize默认 64都是按节点算的不是全局数。读走从节点时从池要按读并发 ÷ 从节点数放大主池按写并发收敛即可——一个值管两池的写法在集群下会失真。scanInterval默认 5000 ms多久重新发现一次拓扑扩缩容后多久生效看它。Spring Boot 落地starter 到自定义 Bean 的三档粒度Spring Boot 集成按你愿意写多少代码分三档由浅入深。第一档什么都不配。引完redisson-spring-boot-starter后starter 会用spring.data.redis.*的 host/port/password 自动构建一个单节点配置应用直接起。第二档指定 redisson.yml 路径。这是最常用的一档把完整配置交给 YAML只留一个指针spring: redis: redisson: file: classpath:redisson-config.ymlredisson-config.yml里就写上一节各形态的块。starter 的RedissonProperties还支持spring.redis.redisson.config直接内联整段 YAML 字符串适合配置中心下发。第三档手写Bean。需要按环境动态算参数时用注意加ConditionalOnMissingBean之类的守卫避免和 starter 自动装配打架Bean(destroyMethod shutdown) ConditionalOnMissingBean public RedissonClient redissonClient() { Config config new Config(); config.useSentinelServers() .setMasterName(mymaster) .addSentinelAddress(26379 节点的地址); return Redisson.create(config); }三档里参数含义和前面完全一致这里不重复。调优三板斧线程池、序列化、连接池调参不靠拍脑袋靠默认值 计算公式。下面三张表覆盖了 90% 的调优动作。线程池Config层所有形态通用参数默认值建议值计算依据threads16CPU 核心 × 2上限 64命令执行/回调线程IO 密集给满不亏nettyThreads32CPU 核心 × 4上限 128Netty IO 线程只跑读写事件多了徒增切换序列化参数默认值建议依据codecKryo5Codec纯 Java 环境保持默认体积小、速度快但不跨语言与 Go/Python 或其他客户端共享 key 时必须换JsonJacksonCodec否则对方读出来是二进制乱码连接池参数默认值建议依据connectionPoolSize64并发数 × 2不低于 32单节点/哨兵是全局池集群下是每节点池connectionMinimumIdleSize24峰值池化的 1/2预热下限避免冷启动批量建连idleConnectionTimeout10000 ms保持默认空闲探活节奏太短浪费、太长留死连接pingConnectionInterval30000 ms跨机房调 10000定期 PING 发现半死连接跨可用区网络抖动多间隔应缩短一句话补充timeout别为了掩盖慢查询无限调大先查慢命令再动它。排错手册三类高频故障的排查动线 排错按看日志 → 定参数 → 动手改走不走弯路。连接超时先找日志里Connection attempt to ... timed out这一行它区分了是建连阶段还是命令阶段超时。再确认connectTimeout建连和timeout命令分别卡在哪一端同时用redis-cli -h 目标 -p 端口 ping验证网络可达性。最后改跨机房或公网场景把connectTimeout放宽到 10000 以上同时把retryAttempts默认 4配合retryInterval让重试真正兜住瞬时抖动如果日志反复出现连旧 IP 失败检查 DNS 监控参数dnsMonitoringInterval默认 5000 ms。序列化不兼容症状是写成功、读报 codec 解析异常或类型转换错且只有新客户端读老 key时出现。先确认当前codec配置和当初写入端的 codec 是否一致——老版本 Redisson 默认 Kryo换过客户端语言或升级过 codec 策略时最容易踩。最后改短期把codec切到JsonJacksonCodec平滑过渡它按 key 自描述编码长期统一团队 codec 规范。集群节点发现失败日志特征是启动时Connection attempt to cluster master node持续失败或运行期出现 slot 覆盖不全的告警。先确认nodeAddresses里至少有一个能连通的节点——Redisson 从任一节点自动发现完整拓扑其他地址只是加速起点给满 6 个地址不保证更快给进已下线的节点反而拖慢启动。再确认checkSlotsCoverage默认 true拓扑不完整会抛错与scanInterval是否符合预期缩容场景下可把scanInterval调小加速感知。开发 / 测试 / 生产三套配置各差在哪环境推荐配置方式关键差异参数开发程序化 / 最短 YAML池化参数全部默认connectionPoolSize可压到 16测试独立 redisson.yml超时与生产对齐timeout3000池化给默认值生产配置中心下发 YAML池化按 QPS 调优pingConnectionInterval缩短retryAttempts保持 ≥3生产环境额外注意多可用区部署时客户端可能拿到内网地址用natMapper做地址映射哨兵/集群的池化参数要按节点数换算别拿单节点的直觉套。配置方式跟着部署形态走调参跟着监控指标走。想深挖字段含义从 Config.java 入手最准文档入口见 docs/configuration.md。【免费下载链接】redissonRedisson: Valkey Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redisson创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻