Jedis源码分析:JedisClusterInfoCache


JedisClusterInfoCache功能模块

方法名说明
集群发现及本地集群缓存信息  
public void discoverClusterNodesAndSlots(Jedis jedis) 通过cluster slots命令发现集群,将集群节点分别缓存到nodes和slots缓存对象中
private void discoverClusterSlots(Jedis jedis) 通过cluster slots命令发现集群,将集群节点缓存到slots缓存对象中
public void assignSlotsToNode(ListtargetSlots,HostAndPort targetNode) 从nodes对象中寻找匹配的master节点,并放入slots缓存对象中
public JedisPool setupNodeIfNotExist(HostAndPort node) 判断nodes缓存中是否存在该节点,如果存在,从nodes对象中取出该节点,如果不存在,则新生成JedisPool对象并放入nodes缓存中
public void assignSlotToNode(intslot,HostAndPort targetNode) 从nodes对象中寻找匹配的master节点,并放入slots缓存对象中
private List getAssignedSlotArray(List  slotInfo) 将槽区间转为槽列表
集群缓存信息刷新和重置  
public void renewClusterSlots(Jedis jedis) 刷新缓存信息
public void reset() 重置缓存,将nodes和slots缓存对象中的数据全部清空
缓存对象获取  
public JedisPool getNode(String nodeKey) 根据key(host:port)从nodes缓存中获取JedisPool对象
public JedisPool getSlotPool(int slot) 根据slots信息获取对应的master节点信息
public Map getNodes() 获取nodes缓存
public List  getShuffledNodesPool() 将nodes中所有对象全部打乱重排并返回新的nodes缓存
辅助方法  
private HostAndPort generateHostAndPort(List hostInfos) 从槽信息对象中获取host和port,转换为HostAndPort对象
public static String getNodeKey(HostAndPort hnp) 获取HostAndPort中的host和port,拼接为host:port字符串
public static String getNodeKey(Client client) 从client对象中获取host和port,拼接为host:port字符串
public static String getNodeKey(Jedis jedis) 从Jedis对象中获取host和port,拼接为host:port字符串

集群发现:提供实例化的Jedis对象,通过"cluster slots"命令获取集群信息,转换为Java对象后,将主从节点信息全部存放至nodes缓存集合中,同时获取所有的槽位信息,将slot->master节点信息键值对存放至slots对象中,具体的流程如下所示。

  • discoverClusterNodesAndSlots(Jedis jedis)方法流程图

  • discoverClusterSlots(Jedis jedis)方法流程图

集群刷新和重置:在无法获取可用的Jedis连接对象时,会执行集群信息刷新操作.如果提供了可用的Jedis对象,那么会调用discoverClusterSlots()方法重新将新的集群信息放入nodes和slots缓存中。如果提供的参数为null值,那么首先会将nodes中的对象打散重排,然后遍历nodes,获取其中的JedisPool对象,最后调用discoverClusterSlots()方法重新将新的集群信息放入nodes和slots缓存。

  • renewClusterSlots(Jedis jedis)方法流程图