让副本承接读流量
集群模式下从节点默认拒绝读请求,并把客户端重定向到负责该槽的主节点。客户端可以显式发送 READONLY,把当前连接标记为允许从从节点读,之后这条连接上的读命令会直接在本节点执行,取到的数据可能略旧。这是集群读写分离的基础机制,用来把只读流量分摊到副本上,减轻主节点压力。
基本信息
| 命令 | READONLY 开启,READWRITE 关闭 |
|---|---|
| 作用范围 | 连接级标记,不影响其他连接 |
| 一致性 | 从副本读可能落后于主节点 |
| 前置条件 | 连接必须指向从节点,且该节点在槽覆盖范围内 |
| 默认行为 | 不发送该命令时从节点会重定向读请求 |
典型使用场景
- 读多写少的业务把查询流量分摊到副本,降低主节点负载
- 报表或离线分析类读取走副本,避免影响在线写入
- 演练与压测中验证副本读的延迟与数据新鲜度差异
- 排查「读到的数据比预期旧」时确认是否走了副本路径
- 为不同的业务连接区分读写路径,明确各自的一致性口径
使用示例
使用示例
redis-cli -c -p 7000 READONLY # 本连接允许从副本读
redis-cli -c -p 7000 GET user:1001 # 数据可能略旧,注意业务容忍度
redis-cli -c -p 7000 READWRITE # 恢复默认行为,读请求重新重定向
redis-cli -c -p 7000 INFO replication | grep role # 确认目标节点角色行为对照
| 连接状态 | 读请求行为 | 适用判断 |
|---|---|---|
| 未标记 | 重定向到主节点 | 默认,一致性最好 |
| 已标记为可读副本 | 在本副本执行,可能读到旧值 | 读多写少、可容忍弱一致 |
| 连接指向主节点 | 标记无实际影响 | 主节点本来就可读写 |
| 连接指向无槽节点 | 仍可能报错 | 检查槽覆盖与节点角色 |
这个标记是连接级的,连接池场景要保证池内所有连接都被设置,否则同一业务会随连接命中不同节点而表现得时新时旧。
强一致读仍要定向主节点,副本读只适合对数据新鲜度不敏感的查询,写后立即读的场景尤其危险。