新增但无影响其他数据的情况
新增Node4节点,看到对原本数据是没有影响的。新增有影响的情况
为了方便演示,把节点和数据移动了一下! 可以看到,新增Node4节点,但是原本的Data1就近原则落在Node4节点上。(原本Data1已经不存在了, 按照一致性hash算法的话,它会在Node4去查这个Data1的数据,为空。这个时候重新put进去到Node4)这个是参考下面博客滴~
变量
/** 按照 键 排序*/ TreeMap<Integer, Node> nodes = new TreeMap<>();使用TreeMap来获取最近的节点
put方法
void put(Obj obj) { int objHashcode = obj.hashCode(); Node node = nodes.get(objHashcode); if (node != null) { node.putObj(obj); return; } // 找到比给定 key 大的集合 SortedMap<Integer, Node> tailMap = nodes.tailMap(objHashcode); // 找到最小的节点 int nodeHashcode = tailMap.isEmpty() ? nodes.firstKey() : tailMap.firstKey(); nodes.get(nodeHashcode).putObj(obj); }根据nodes.tailMap方法找到比这个数据大的节点,如果有则说明数据落在最大节点Map里面的最小的节点上。 如果没有比它大的节点map,由于是闭环!!!把数据赋值给第一个最小节点。
get方法
Obj get(Obj obj) { Node node = nodes.get(obj.hashCode()); if (node != null) { return node.getObj(obj); } // 找到比给定 key 大的集合 SortedMap<Integer, Node> tailMap = nodes.tailMap(obj.hashCode()); // 找到最小的节点 int nodeHashcode = tailMap.isEmpty() ? nodes.firstKey() : tailMap.firstKey(); return nodes.get(nodeHashcode).getObj(obj); }如果落在节点上。直接获取节点上的数据。如果不在节点上,就近找到节点获取数据。
一致性hash实现.
自己实现一个一致性-Hash-算法.