架构设计
请列举出在JDK中几个常用的设计模式?
什么是设计模式?你是否在你的代码里面使用过任何设计模式?
静态代理、JDK动态代理以及CGLIB动态代理
静态代理
动态代理
cglib代理
单例模式
工厂模式
观察者模式
装饰器模式
秒杀系统设计
分布式
分布式概述
分布式
集群
微服务
多线程
高并发
分布式系统设计理念
分布式系统的目标与要素
分布式系统设计两大思路:中心化和去中心化
分布式与集群的区别是什么?
CAP定理
CAP定理的证明
BASE理论
BASE理论的核心思想
BASE理论三要素
1. 基本可用
2. 软状态
3. 最终一致性
数据结构与算法
冒泡排序(最高位确认最大)
选择排序(最低位选最小)
快速排序
递归
二分查找
一致性Hash算法
概述
一致性Hash算法原理
Java代码实现
public class ConsistentHash<T> {
/**
* 节点的复制因子,实际节点个数 * numberOfReplicas = 虚拟节点个数
*/
private final int numberOfReplicas;
/**
* 存储虚拟节点的hash值到真实节点的映射
*/
private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();
public ConsistentHash(int numberOfReplicas, Collection<T> nodes) {
this.numberOfReplicas = numberOfReplicas;
for (T node : nodes) {
add(node);
}
}
public void add(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
// 对于一个实际机器节点 node, 对应 numberOfReplicas 个虚拟节点
/*
* 不同的虚拟节点(i不同)有不同的hash值,但都对应同一个实际机器node
* 虚拟node一般是均衡分布在环上的,数据存储在顺时针方向的虚拟node上
*/
String nodestr = node.toString() + i;
int hashcode = nodestr.hashCode();
System.out.println("hashcode:" + hashcode);
circle.put(hashcode, node);
}
}
public void remove(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.remove((node.toString() + i).hashCode());
}
}
/**
* 获得一个最近的顺时针节点,根据给定的key 取Hash
* 然后再取得顺时针方向上最近的一个虚拟节点对应的实际节点
* 再从实际节点中取得 数据
*
* @param key
* @return
*/
public T get(Object key) {
if (circle.isEmpty()) {
return null;
}
// node 用String来表示,获得node在哈希环中的hashCode
int hash = key.hashCode();
System.out.println("hashcode----->:" + hash);
//数据映射在两台虚拟机器所在环之间,就需要按顺时针方向寻找机器
if (!circle.containsKey(hash)) {
SortedMap<Integer, T> tailMap = circle.tailMap(hash);
hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
}
return circle.get(hash);
}
public long getSize() {
return circle.size();
}
/**
* 查看表示整个哈希环中各个虚拟节点位置
*/
public void testBalance() {
//获得TreeMap中所有的Key
Set<Integer> sets = circle.keySet();
//将获得的Key集合排序
SortedSet<Integer> sortedSets = new TreeSet<Integer>(sets);
for (Integer hashCode : sortedSets) {
System.out.println(hashCode);
}
System.out.println("----each location 's distance are follows: ----");
/*
* 查看相邻两个hashCode的差值
*/
Iterator<Integer> it = sortedSets.iterator();
Iterator<Integer> it2 = sortedSets.iterator();
if (it2.hasNext()) {
it2.next();
}
long keyPre, keyAfter;
while (it.hasNext() && it2.hasNext()) {
keyPre = it.next();
keyAfter = it2.next();
System.out.println(keyAfter - keyPre);
}
}
public static void main(String[] args) {
Set<String> nodes = new HashSet<String>();
nodes.add("A");
nodes.add("B");
nodes.add("C");
ConsistentHash<String> consistentHash = new ConsistentHash<String>(2, nodes);
consistentHash.add("D");
System.out.println("hash circle size: " + consistentHash.getSize());
System.out.println("location of each node are follows: ");
consistentHash.testBalance();
String node = consistentHash.get("apple");
System.out.println("node----------->:" + node);
}
}
转载链接:https://blog.csdn.net/ThinkWon/article/details/105870730