分布式缓存服务 DCS-Lettuce客户端连接Redis(Java):DCS实例配置建议
D CS 实例配置建议
- 连接池化
因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();
- 基于application.properties配置
- 爆炸半径
因lettuce底层采用的是单长连接 + 请求队列的组合模式,一旦遇到网络抖动/闪断,或连接失活,将影响所有请求,尤其是在连接失活场景中,将尝试tcp重传,直至重传超时关闭连接,待连接重建后才能恢复。在重传期间请求队列会不断堆积请求,上层业务非常容易出现批量超时,甚至在部分操作系统内核中的重传超时配置过长,致使业务系统长时间处于不可用状态。因此,不推荐使用lettuce组件,建议用jedis组件替换。
- 分布式缓存Redis实战_Redis技术实战_分布式缓存-华为云
- 分布式缓存服务Redis的安全能力_分布式缓存服务Redis的数据安全性
- 数据缓存_数据高并发_数据高可用-华为云
- 分布式缓存数据迁移_分布式缓存_数据迁移-华为云
- 分布式缓存Redis版本差异_分布式缓存Redis有哪些版本_分布式缓存-华为云
- 分布式缓存服务Redis优势_分布式缓存服务Redis_华为云
- 分布式缓存服务Redis版_什么是分布式缓存
- 分布式缓存Redis企业版优势_分布式缓存Redis企业版特点
- 数据库压力怎么办_Redis_分布式缓存-华为云
- 分布式缓存Redis稳定性怎么样_分布式缓存Redis_企业版-华为云