Redis Cluster 数据分片( 五 )


def ASKING():# 打开标识client.flags |= REDIS_ASKING# 向客户端返回OK 回复reply("OK")在一般情况下,如果客户端向节点发送一个关于槽 i 的命令,而槽 i 又没有指派给这个节点的话,那么节点将向客户端返回一个 moved 错误;但是,如果节点的 clusterState.importing_slots_from[i] 显示节点正在导入槽 i,并且发送命令的客户端带有 REDIS_ASKING 标识,那么节点将破例执行这个关于槽 i 的命令一次 。
需要注意的是,客户端的 REDIS_ASKING 标识是一个一次性标识,当节点执行了一个带有 REDIS_ASKING 标识的客户端发送的命令之后,客户端的 REDIS_ASKING 标识就会被移除 。
节点判断是否执行客户端命令的过程

Redis Cluster 数据分片

文章插图
ask 错误和 moved 错误都会导致客户端转向,它们的区别在于:
  • moved 错误代表槽的负责权已经从一个节点转移到了另一个节点:在客户端收到关于槽 i 的 moved 错误之后,客户端每次遇到关于槽 i 的命令请求时,都可以直接将命令请求发送至 moved 错误所指向的节点,因为该节点就是目前负责槽 i 的节点 。
  • 与此相反,ask 错误只是两个节点在迁移槽的过程中使用的一种临时措施:在客户端收到关于槽 i 的 ask 错误之后,客户端只会在接下来的一次命令请求中将关于槽 i 的命令请求发送至 ask 错误所指示的节点,但这种转向不会对客户端今后发送关于槽 i 的命令请求产生任何影响,客户端仍然会将关于槽 i 的命令请求发送至目前负责处理槽 i 的节点,除非 ask 错误再次出现 。
参考资料《Redis 设计与实现》书籍
【Redis Cluster 数据分片】

经验总结扩展阅读