package cn.ceopen.shard.utils;
import java.util.ArrayList;
import java.util.List;
/**
* 一致性hash 用list简单实现
* @author 徐良永
*
* 2015年1月22日 上午11:13:35
*/
public class ConsistentHash {
/**
* 圆环的长度
*/
private static final int CIRCLE_LENGTH = 100;
//圆环
private List<Node> circle = new ArrayList<Node>(CIRCLE_LENGTH);
private List<Node> realNodes = new ArrayList<Node>();
/**
* 添加真实结点
* @param node
*/
public void addNode(Node node){
realNodes.add(node);
refreshCircle();
}
/**
* 删除真实结点
* @param node
*/
public void removeNode(Node node){
realNodes.remove(node);
refreshCircle();
}
/**
* 刷新圆环
*/
private void refreshCircle(){
int n = CIRCLE_LENGTH / realNodes.size(); //把circle分成 n 份, n是真实结点个数
int index = 0;
//给圆环的每个节点赋值
for (int i = 0; i < realNodes.size(); i++) {
for (int j = 0; j < n; j++) {
circle.add(index++, realNodes.get(i));
}
}
//余下的节点 用第一个真实结点赋值
for (int i = index; i < CIRCLE_LENGTH; i++) {
circle.add(i, realNodes.get(0));
}
}
public ConsistentHash(){
}
public Node getNode(int key){
return circle.get(key % CIRCLE_LENGTH);
}
public static void main(String[] args) {
ConsistentHash h = new ConsistentHash();
h.addNode(new Node(1));
h.addNode(new Node(2));
h.addNode(new Node(3));
for (int i = 0; i < 150; i++) {
System.out.println(i + "--->" + h.getNode(i).toString());
}
}
static class Node{
private int nodeNum;
public Node(int num){
this.nodeNum = num;
}
@Override
public String toString(){
return "真实结点:" + nodeNum ;
}
}
}
分享到:
相关推荐
本压缩包文件"一致性哈希算法演示.rar"包含了一个C#实现的一致性哈希算法演示项目,可以在Visual Studio 2019环境下运行。该项目可以帮助我们理解一致性哈希的工作原理,通过观察不同情况下(如添加或移除节点)数据...
对于Java实现一致性Hash算法,有几种可能的方法: 1. **排序+List**:首先,将所有服务器节点的哈希值放入一个数组,然后使用排序算法(如归并排序、快速排序等)对数组进行排序,再将排序后的结果放入List中。之后...
### Java 计算同一 List 中是否有相同值 在 Java 编程中,判断一个 `List` 中是否存在重复元素是一项常见的需求。特别是在数据处理、验证或分析等场景中,确保数据的唯一性对于维持数据完整性至关重要。 #### 核心...
在这个场景下,我们将深入探讨一致性哈希算法的原理、特点以及在Java和C++中的实现。 一致性哈希算法的基本思想是将哈希空间环绕成一个虚拟的圆环,每个节点都被分配到这个环上的一个或多个位置。当需要将数据映射...
在Java环境下实现一致性哈希,我们可以创建两个关键类:`Shared`和`Node`。 首先,一致性哈希的核心思想是通过哈希函数将数据映射到一个固定大小的环形空间上,这个空间通常是一个整数环。每个节点(例如服务器)也...
// 如果需要,可以覆盖其他方法以确保一致性 } ``` 然后,你可以使用这个`OrderedJSONObject`类来保存List的顺序: ```java List<String> list = Arrays.asList("item1", "item2", "item3"); OrderedJSONObject ...
为了确保一致性,推荐使用Apache Commons Lang库中的`HashCodeBuilder`类来生成高质量的`hashCode`值。 - **基于排序二叉树的实现**:`TreeMap`和`TreeSet`采用红黑树数据结构实现,这要求集合中的元素必须具备可...
在自定义类中,为了使对象能被HashSet或HashMap正确处理,通常需要重写hashCode()和equals()方法,确保它们遵循一致性原则。 在ArrayList和HashSet的比较中,我们可以总结以下几点: 1. 数据结构:ArrayList基于...
这里涉及数值计算和事务处理,以确保操作的原子性和一致性。 4. **转账**:用户可向其他账户转账。这个功能需要处理两个账户之间的资金转移,同样需要事务控制,防止因网络或其他问题导致的数据不一致。 5. **查询...
如果需要在多台Redis服务器间迁移数据,可以将上述逻辑封装为一个服务,通过消息队列或定时任务触发迁移操作,确保数据一致性。 通过以上步骤,我们可以实现Java对Redis数据的导入和导出。这不仅可以帮助我们在...
ArrayList和LinkedList虽然不是Set,但它们的父接口List属于Collection,而Collection接口有一个子接口Set,例如HashSet是Set接口的一个实现,它内部基于HashMap实现,保证元素唯一性。 7. WeakHashMap WeakHashMap...
它位于 `java.util` 包下,提供了一系列接口和实现类,使得开发者能够灵活地处理各种数据结构,如数组、链表、哈希表等。 **Collection 接口** Collection 是所有集合类的顶级接口,它定义了集合的基本操作。...
在分布式系统中,一致性哈希解决负载均衡和数据分布问题,保证哈希结果的稳定。 27. **构造方法链**: 当子类调用父类构造器时,形成构造方法链,确保初始化顺序。 28-31. **线程调度,类加载方式,Class.for...
这样,编译器可以在编译时检查类型一致性,防止在运行时出现ClassCastException。泛型的基本语法是在类或接口声明中使用尖括号`<>`,例如`List<String>`表示只存储String类型的List。 1. **类型擦除**: Java泛型在...
Java集合框架是Java编程语言中的核心部分,它提供了一种高效、灵活的...同时,还需要注意线程安全问题,对于多线程环境,可能需要考虑使用ConcurrentHashMap或Collections.synchronizedXXX()方法来确保数据的一致性。
- **类型一致性**:数组存储的元素必须是同一数据类型;而集合可以存储不同类型的对象。 #### 4. 使用集合框架的好处 - **容量自增长**:集合能够自动调整容量,无需手动调整。 - **高效的数据结构和算法**:集合...
了解和熟练掌握List、Set和Map接口及其实现类,对于编写高效、可维护的Java代码至关重要。在实际应用中,根据需求选择合适的集合类型,并结合排序、遍历、线程安全等知识点,能够更好地解决各种数据结构问题。
* HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。 * TreeSet:基于红黑树实现,支持有序性操作,但查找效率不如 HashSet。 * LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护...
2. 分布式事务、一致性哈希和负载均衡技术是构建高性能分布式系统的关键技术。 以上知识点涵盖了Java面试中常见的考察范围,涉及Java语言的特性、集合框架、并发编程、内存模型、网络编程、中间件、数据库、安全、...
7. **并发处理**:Java集合框架也支持线程安全的实现,如ConcurrentHashMap和CopyOnWriteArrayList,这在多线程游戏环境中非常重要,可以保证数据的一致性和正确性。 8. **性能优化**:了解集合的内部原理和操作...