redis集群中的slot:
redis Cluster 是redis3.0引入的一种无中心化的集群,客户端可以向任意一个节点通信,不同的节点群之间数据不互通;redis Cluster将数据的key通过CRC16算法的结果并取模16383后,分为16384个slot槽,每个master节点都被分配到一段slot槽中,这个节点只负责管理key映射到这个槽的k-v数据,对于不是当前槽的key的交互,会向客户端发送一个MOVED,表示需要客户端自行重定向其他节点。
JedisCluster对于redisCluster的去中心化的适配方案:
在项目启动时建立一条连接获取redis.clusterslot信息,并根据结果创建slot范围和redis连接的映射;对于每次redis请求,都先通过CRC16+取模来计算key对应的槽,再根据存储的映射关系来创建对应的socket套接字连接,若远程返回MOVED,jedis会抛出JedisRedirectionException的子类JedisMovedDataException,此时JedisCluster会刷新缓存的slot和redis连接的映射关系,然后重试请求。
JedisCluster计算CRC16%16384时用的是与运算CRC16&16383;其原理与HashMap的hash过程是完全相同的。