什么是Smart Jedis
基于重定向的客户端(redis-cli -c
),大部分情况下,每一次的读写请求都会出现重定向,很消耗网络IO。
所以,smart jedis,会在本地会维护一份 hashslot->node 的映射表,每一次请求都会先从本地缓存的映射表中找到hashslot对应的node信息,然后再进行请求的操作。这种方式就不需要去通过节点进行重定向操作。
Jedis Cluster工作原理
(1)在Jedis Cluster初始化时,会随机选择一个节点,初始化 hashslot->node的映射表,同时为每个节点创建一个JedisPool连接池。
(2)每次基于JedisCluster执行操作,JedisCluster会首先在本地计算key对应的hashslot(key的crc16值与hashslot数量取模),然后再通过本地映射表,找到这个hashslot对应的节点信息。
(3)如果找到的节点信息正好持有这个hashslot,就会直接ok或者获得数据;
(4)如果找到的节点信息并没有持有这个hashslot,就会直接返回moved信息;
- 返回moved的信息,说明之前可能进行了reshard操作,导致hashslot已经不在这个节点上了;
- JedisCluster发现对应节点返回moved,会利用该节点的元数据更新本地hashslot->node的映射表缓存。
Jedis cluster获取数据会重复操作上述步骤,直到找到对应的节点。如果重复步骤超过5次,就会报 JedisClusterMaxRedirectionException
异常。
hashslot迁移和ask重定向
如果在进行hash slot迁移操作时,数据的请求会直接返回ack重定向给jedis。
jedis接收到ask重定向后,会重新定位目标节点去执行,ask重定向时发生在hash slot迁移过程中。
JedisCluster API收到ask并不会去更新hashslot本地缓存映射表。
只有JedisCluster API在hashslot已经迁移完毕,返回moved才会更新节点本地的hashslot->node的映射表缓存。