RedisCluster redis集群是如何查询key所在位置的?扩容的时候呢?
1 个回答
慢慢理解世界,慢慢更新自己。美世美客户端执行命令的流程: 假设客户端需要发送一个查询请求时,首先会对key使用CRC16算法计算得到一个hash值,然后将hash值与16384(也就是2的14次方)进行取模(下面是网上找的图,应该是CRC16(key)%16384),得到一个槽位slot,然后根据本地缓存的槽位映射关系表,找到这个槽位slot对应的主节点,发送查询命令。主节点在收到命令后会有以下几种情况: 1.这个主节点确实负责这个槽位,且不在迁移中。 直接查询到这个键值对,返回给客户端。 2.这个主节点不负责这个槽位,或者已经确定转移到其他节点上去了(Moved指令) 可能是这个槽位已经迁移了,或者是客户端将指令发送到了错误的节点,或者是客户端缓存的槽位映射关系以前过期。主节点就会给客户端返回Moved指令及正确的节点信息,Moved指令相当于是一个永久重定向指令,用于纠正客户端缓存的错误槽位信息。客户端收到后会更新本地的槽位关系表,然后向正确的节点发送查询指令。 3.这个槽位正在迁移中(ASKING指令) 如果这个槽位之前是在这个主节点上,但是目前正在迁移(槽位状态为IMPORTING),那么如果现在主节点上存在这个可以,就成功处理请求。否则就返回ASKING指令+槽位所在的新节点,ASKING指令相当于是一个临时重定向指令,客户端收到之后不会更新本地的槽位关系表,只是将本次请求发送到新节点。发布于 2022-03-08 11:03 •IP属地 安徽举报评论收藏
公众号进入网站体验更佳

