ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Redisson 配置速查:最小可用配置、连接池调优与踩坑处理

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连接池参数设错线上 Redisson 客户端就会频繁重建连接、锁看门狗行为异常。本文按单机 → 集群 → 哨兵 → Spring Boot四类场景给出最小可用配置和参数取值依据读完能直接套用并知道压测后该动哪几个数字。先搞清楚这套配置到底在配什么Redisson 所有模式单机、主从、哨兵、集群共用一个Config对象配置分两层全局层线程、编解码、看门狗和模式层地址、连接池、扫描间隔。全局层定义在redisson/src/main/java/org/redisson/config/Config.java各模式的连接池参数散落在同目录的SingleServerConfig、ClusterServersConfig等类里官方完整字段说明见docs/configuration.md。参数源码默认值作用connectionPoolSize64每条连接池的最大连接数决定单机吞吐上限connectionMinimumIdleSize24最小空闲连接突发流量下免冷启动connectTimeout10000msTCP 建连超时不是命令超时timeout3000ms命令发出后的应答超时超时未返回即失败retryAttempts4命令发送失败后的重试次数idleConnectionTimeout10000ms空闲连接回收阈值连接数高于最小空闲值时才回收threads/nettyThreads16 / 32业务回调线程数 / Netty IO 线程数codecKryo5Codec数据序列化方案影响体积、速度和跨语言兼容性lockWatchdogTimeout30000ms分布式锁看门狗续期周期集群scanInterval5000ms集群拓扑扫描间隔节点扩缩容后多久生效⚠️ 注意retryInterval已在源码中标记为废弃重试间隔改用retryDelay的延迟策略如EqualJitterDelay控制旧配置里写这个字段只会收到警告日志。按部署场景对号入座单机YAML 五分钟内跑通singleServerConfig: address: redis://127.0.0.1:6379 database: 0 connectionPoolSize: 32 connectionMinimumIdleSize: 16 connectTimeout: 5000 timeout: 1000 retryAttempts: 3 password: yourpassword threads: 8 nettyThreads: 16加载方式Config.fromYAML(new File(redisson.yaml))后交给Redisson.create(config)。为什么这么设connectionPoolSize从默认的 64 降到 32是因为单机开发/中小规模下 64 条长连接会推高 Redis 端maxclients压力32 已覆盖多数接口 QPStimeout收到 1000ms命令超时设太大会让慢查询把线程挂死快速失败交给上层重试更可控address支持${VAR}变量语法环境变量优先于系统属性同一份 YAML 可复用到多环境。集群程序化配置 读策略Config config new Config(); config.useClusterServers() .addNodeAddress(redis://10.0.0.1:7000, redis://10.0.0.2:7000, redis://10.0.0.3:7000) .setPassword(yourpassword) .setMasterConnectionPoolSize(32) .setSlaveConnectionPoolSize(32) .setReadMode(ReadMode.SLAVE) .setSubscriptionMode(SubscriptionMode.SLAVE) .setScanInterval(5000); RedissonClient client Redisson.create(config);为什么这么设集群只要求给出部分节点地址其余拓扑靠CLUSTER SLOTS自动发现nodeAddresses里放 3 个不同 master 即可✅ReadMode.SLAVE把读流量分摊到从节点主节点只扛写纯读场景收益最大但要求从节点复制延迟可接受SubscriptionMode控制 pub/sub 订到哪个角色订阅量大的业务选 SLAVE 可避免打满主节点连接数。哨兵把主节点名字交给哨兵sentinelServersConfig: sentinelAddresses: - redis://10.0.0.1:26379 - redis://10.0.0.2:26379 masterName: mymaster slaveConnectionPoolSize: 32 masterConnectionPoolSize: 32 password: yourpassword为什么这么设代码里不写任何数据节点地址主/从全部由masterName向哨兵查询得到主切换后下一次查询自动跟随新主sentinelAddresses至少配 2 个避免单个哨兵故障时客户端失去寻址能力哨兵模式下scanInterval默认 1000ms比集群的 5000ms 更激进因为主切换需要更快感知。Spring Boot一个属性指向 YAMLStarter 的RedissonAutoConfiguration读取前缀为spring.redis.redisson的属性见redisson-spring/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/RedissonAutoConfiguration.java源码侧对应RedissonProperties只有file与config两个字段# 二选一文件路径 或 直接内联 YAML 文本 spring.redis.redisson.fileclasspath:redisson.yaml若不想维护 YAML也可以直接注册 BeanConfiguration public class RedissonConfig { Bean(destroyMethod shutdown) public RedissonClient redissonClient() { Config cfg new Config(); cfg.useSingleServer().setAddress(redis://10.0.0.1:6379); return Redisson.create(cfg); } }注意 Bean 上保留destroyMethod shutdown否则容器关闭时连接池不会释放日志里会留一堆未关闭的 Netty channel。让性能跟上来三个维度线程、序列化、连接合并成一张表按适用条件取用参数建议值适用条件threads2 × CPU 核数默认 16回调里有较重业务逻辑反序列化、加锁判断时上调nettyThreads4 × CPU 核数默认 32高连接数 高消息频率IO 成为瓶颈时上调codec纯 Java 生态用 Kryo5默认跨语言/需人工读数据换JsonJacksonCodecJSON 体积约为二进制 2~3 倍带宽紧张时别用connectionPoolSize按QPS × 平均命令耗时(ms) / 1000估算向上取整留 20%压测时观察连接等待队列池子打满再加大不要拍脑袋给 200connectionMinimumIdleSize约为池子的 50%突发流量场景避免峰值瞬间集中建连idleConnectionTimeout默认 10000msNAT/防火墙环境调大到 30000ms 以上小于中间设备断连空闲阈值时连接会被半路切断lockWatchdogTimeout默认 30000ms续期周期约为其 1/3业务持锁时间远超默认值时单独调整别全局放宽 一个容易忽略的点threads和nettyThreads是每客户端实例的量。同一进程里创建多个RedissonClient时线程总量要合并核算否则实际线程数是配值的 N 倍。踩坑速查症状常见原因动作启动即RedisConnectionException提示连接超时connectTimeout与网络实际 RTT 不匹配地址写错协议rediss://连到非 TLS 端口先telnet验证端口连通性核对 scheme 前缀跨网段把connectTimeout提到 5000 以上读写报序列化/反序列化异常或旧数据读不出换了 codecKryo5 ↔ JSON历史数据的字节结构不兼容codec 一旦上线不可随意更换新旧客户端同版本发布必要时双读过渡集群扩缩容后请求持续路由到旧节点scanInterval未到扫描周期拓扑未刷新短期手动重建客户端长期把scanInterval调小但别低于 2000ms避免CLUSTER SLOTS风暴分布式锁莫名释放业务并发冲突看门狗续期任务被 GC 长停顿或threads池饥饿拖垮检查threads是否被业务逻辑占满确认锁对象在同一 JVM 生命周期内未重复 unlock空闲一段时间后首条命令报连接断开idleConnectionTimeout小于防火墙/NAT 的空闲断连时间池里留了尸体连接把idleConnectionTimeout调小到低于中间设备空闲阈值让客户端主动回收收尾清单开发/测试环境用 YAML${VAR}变量化端口和密码生产环境保持文件配置并纳入配置中心程序化配置只用于需要按机器规格动态算线程数的场景上线前固定一次 codec 选型并写进代码评审 checklist序列化方案变更等同于数据迁移连接池参数以压测数据为准等待队列空着就把池子调小打满就按估算公式加大禁止直接给最大值每 3 个月核对一次Config.java默认值变更如重试策略、DNS 监控参数避免没配和默认改了之间的行为漂移客户端实例数 × 每实例线程数 进程总线程预算多客户端场景先算账再配置。【免费下载链接】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 READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进