最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Spring Boot使用Redis实现读写分离时需要注意什么?
时间:2026-08-10 17:25:49 编辑:袖梨 来源:一聚教程网
必须显式配置read-from,否则所有读写请求默认全走主节点;推荐生产使用REPLICA_PREFERRED,优先读从节点,从节点不可用时自动降级读主节点。
read-from 必须显式配置,否则所有请求都打到主节点
Spring Boot 默认不启用读写分离,spring.redis.host 和 spring.redis.port 只能指向单节点,即使你写成逗号分隔的多个地址,Lettuce 也只当它是故障转移候选列表,不会自动识别主从拓扑。所有 @Cacheable、redisTemplate.opsForValue().get()、redisTemplate.hasKey() 都会发往主节点——监控里能看到主节点连接数高、延迟涨,而从节点 CPU/网络几乎为零。
必须在配置中明确声明 read-from 策略,且位置不能错:
- 哨兵模式下,要写在
spring.redis.lettuce.read-from(不是spring.redis.lettuce.cluster.read-from) - 主从直连模式下,需配合
spring.redis.cluster.nodes列出主+所有从节点 - 配置项大小写敏感:
REPLICA_PREFERRED(Lettuce 3.2+),旧版本才用SLAVE_PREFERRED
哨兵模式下,sentinel 配置缺一不可
仅配 spring.redis.sentinel.nodes 不够,spring.redis.sentinel.master 必须与哨兵配置文件 sentinel.conf 中 sentinel monitor 后的名称完全一致,否则 Lettuce 无法拉取主从拓扑信息,read-from 就是空转。
常见错误包括:
- 把 Redis 数据节点地址误填进
nodes,实际该填哨兵节点地址(如26379端口) - 漏掉
sentinel块,导致 Lettuce 退化为单节点直连行为 - 密码配置错层:哨兵验证密码走
spring.redis.sentinel.password,数据节点密码走spring.redis.password
read-from 是运行时动态选节点,不是连接初始化就绑定
read-from 策略在每次调用 sync() 或 async() 时才触发节点选择,这意味着:
- 它对
RedisTemplate、@Cacheable、ReactiveRedisTemplate全局生效,无需额外适配 - 策略不保证“绝对读从”,
REPLICA_PREFERRED是优先读从,所有从节点都不可用时自动降级读主,保障可用性 - 如果需要按 IDC、用户标签等条件动态切换策略(比如深圳机房读从、北京机房读主),就得用
LettuceClientConfigurationBuilderCustomizer在代码里干预客户端构建过程,yml 静态配置做不到
主从延迟导致读不到最新写入
Redis 主从复制是异步的,REPLICA_PREFERRED 下的读操作可能读到几毫秒甚至几百毫秒前的数据。这不是配置问题,而是架构限制。
业务上需接受最终一致性,并注意:
- 不要在写后立即用同一 key 读——例如
set("user:1001", "xxx")后立刻get("user:1001"),结果可能为空或旧值 - 对强一致性要求高的场景(如支付状态查询),应显式路由到主节点,可通过
RedisTemplate.getConnectionFactory().getConnection().read(ReadFrom.MASTER)临时覆盖策略 - 监控
INFO replication中的master_repl_offset和各从节点slave_repl_offset差值,评估延迟水位
相关文章
- 校友邦网页版登录入口-校友邦网页版登录官网 08-10
- 壹品仓app如何下单 08-10
- 学信网官方网站入口在哪-学信网学籍查询入口 08-10
- 同步学如何加入班级 08-10
- 1元10抖币充值入口苹果-抖币1:10充值入口 08-10
- 雨果跨境app如何关闭个性化推荐 08-10