一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Spring Boot使用Redis实现读写分离时需要注意什么?

时间:2026-08-10 17:25:49 编辑:袖梨 来源:一聚教程网

必须显式配置read-from,否则所有读写请求默认全走主节点;推荐生产使用REPLICA_PREFERRED,优先读从节点,从节点不可用时自动降级读主节点。

read-from 必须显式配置,否则所有请求都打到主节点

Spring Boot 默认不启用读写分离,spring.redis.hostspring.redis.port 只能指向单节点,即使你写成逗号分隔的多个地址,Lettuce 也只当它是故障转移候选列表,不会自动识别主从拓扑。所有 @CacheableredisTemplate.opsForValue().get()redisTemplate.hasKey() 都会发往主节点——监控里能看到主节点连接数高、延迟涨,而从节点 CPU/网络几乎为零。

必须在配置中明确声明 read-from 策略,且位置不能错:

  1. 哨兵模式下,要写在 spring.redis.lettuce.read-from(不是 spring.redis.lettuce.cluster.read-from
  2. 主从直连模式下,需配合 spring.redis.cluster.nodes 列出主+所有从节点
  3. 配置项大小写敏感:REPLICA_PREFERRED(Lettuce 3.2+),旧版本才用 SLAVE_PREFERRED

哨兵模式下,sentinel 配置缺一不可

仅配 spring.redis.sentinel.nodes 不够,spring.redis.sentinel.master 必须与哨兵配置文件 sentinel.confsentinel monitor 后的名称完全一致,否则 Lettuce 无法拉取主从拓扑信息,read-from 就是空转。

常见错误包括:

  1. 把 Redis 数据节点地址误填进 nodes,实际该填哨兵节点地址(如 26379 端口)
  2. 漏掉 sentinel 块,导致 Lettuce 退化为单节点直连行为
  3. 密码配置错层:哨兵验证密码走 spring.redis.sentinel.password,数据节点密码走 spring.redis.password

read-from 是运行时动态选节点,不是连接初始化就绑定

read-from 策略在每次调用 sync()async() 时才触发节点选择,这意味着:

  1. 它对 RedisTemplate@CacheableReactiveRedisTemplate 全局生效,无需额外适配
  2. 策略不保证“绝对读从”,REPLICA_PREFERRED 是优先读从,所有从节点都不可用时自动降级读主,保障可用性
  3. 如果需要按 IDC、用户标签等条件动态切换策略(比如深圳机房读从、北京机房读主),就得用 LettuceClientConfigurationBuilderCustomizer 在代码里干预客户端构建过程,yml 静态配置做不到

主从延迟导致读不到最新写入

Redis 主从复制是异步的,REPLICA_PREFERRED 下的读操作可能读到几毫秒甚至几百毫秒前的数据。这不是配置问题,而是架构限制。

业务上需接受最终一致性,并注意:

  1. 不要在写后立即用同一 key 读——例如 set("user:1001", "xxx") 后立刻 get("user:1001"),结果可能为空或旧值
  2. 对强一致性要求高的场景(如支付状态查询),应显式路由到主节点,可通过 RedisTemplate.getConnectionFactory().getConnection().read(ReadFrom.MASTER) 临时覆盖策略
  3. 监控 INFO replication 中的 master_repl_offset 和各从节点 slave_repl_offset 差值,评估延迟水位

热门栏目