679 字
3 分钟
Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?本文
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

Redis Cluster 客户端通常缓存槽位到节点的映射,并直接把请求发给目标节点。映射过期或槽位正在迁移时,节点可能返回重定向:MOVED 表示应按新的槽位归属访问,ASK 表示这一次请求需要临时去另一个节点。

正常归属变化与迁移状态#

槽位已经由 B 负责,客户端却仍向 A 请求时,A 返回 MOVED,包含槽位与目标地址。客户端据此更新路由,必要时刷新完整拓扑;之后对该槽位的请求也应发往 B。

槽位迁移过程中,A 处于 MIGRATING,B 处于 IMPORTING。一部分 Key 已转移到 B,另一部分还在 A。A 如果仍有请求的 Key,可以直接处理;如果该 Key 不在 A,需要通过 ASK 让客户端去 B,并先在同一连接发送 ASKING,使 B 接受这一次尚未完成归属切换的访问。不能因为一次 ASK 就永久把该槽位路由改成 B。

响应客户端主要行为
MOVED重试目标节点,并更新槽位路由
ASK临时访问目标,在同一连接先发 ASKING,不据此永久改路由
TRYAGAIN某些迁移中多 Key 情况暂时无法处理,按策略有限重试

为什么业务需要集群客户端?#

普通单节点客户端可能直接把这些错误交给应用。集群客户端需管理槽位映射、连接池、重试与拓扑刷新,同时保留超时和幂等边界。重定向说明这个节点未按常规路径处理该请求,但一般网络超时的结果可能不确定;非幂等命令不能把所有异常都当成“没执行过”。

常见追问#

MOVED 永远不会再变吗?#

会再变。它表示当时的归属信息,未来扩缩容和切主仍可能改变映射。缓存路由应能根据新重定向刷新。

ASKING 后所有请求都可以随便访问目标节点吗?#

不是。它是针对后续一次请求的迁移访问授权,需要同一连接,不能把它当成关闭槽位检查的全局开关。

扩容是否只增加一个空节点就结束?#

不是。需要分配或迁移槽位,迁移数据,再完成归属切换;过程涉及重定向、网络与单 Key 搬迁成本。

Gossip 会把用户的 Value 复制到所有节点吗?#

不会。Gossip 主要交换节点状态和集群信息,业务数据按槽位分片,并由负责该分片的主节点复制给其副本。

Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
https://blog.xqcherry.top/posts/interview/redis/redis-cluster-moved-ask/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0