目录
- 架构设计
- 请列举出在JDK中几个常用的设计模式?
- 什么是设计模式?你是否在你的代码里面使用过任何设计模式?
- 静态代理、JDK动态代理以及CGLIB动态代理
- 静态代理
- 动态代理
- cglib代理
- 单例模式
- 工厂模式
- 观察者模式
- 装饰器模式
- 秒杀系统设计
- 分布式
- 分布式概述
- 分布式
- 集群
- 微服务
- 多线程
- 高并发
- 分布式系统设计理念
- 分布式系统的目标与要素
- 分布式系统设计两大思路:中心化和去中心化
- 分布式与集群的区别是什么?
- CAP定理
- CAP定理的证明
- BASE理论
- BASE理论的核心思想
- BASE理论三要素
- 1. 基本可用
- 2. 软状态
- 3. 最终一致性
- 数据结构与算法
- 冒泡排序(最高位确认最大)
- 选择排序(最低位选最小)
- 快速排序
- 递归
- 二分查找
- 一致性Hash算法
- 概述
- 一致性Hash算法原理
架构设计
请列举出在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在哈希环中的hashCodeint 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中所有的KeySet<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