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 |
获取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)方法流程图