Skip to content

Commit 3adedd7

Browse files
committed
📝 Writing docs.
1 parent 0006b02 commit 3adedd7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+10891
-0
lines changed

docs/.nojekyll

Whitespace-only changes.

docs/README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
<div align="center">
3+
4+
5+
[![Build Status](https://travis-ci.org/crossoverJie/JCSprout.svg?branch=master)](https://travis-ci.org/crossoverJie/JCSprout)
6+
[![QQ群](https://img.shields.io/badge/QQ%E7%BE%A4-787381170-yellowgreen.svg)](https://jq.qq.com/?_wv=1027&k=5HPYvQk)
7+
8+
[qq0groupsvg]: https://img.shields.io/badge/QQ%E7%BE%A4-787381170-yellowgreen.svg
9+
[qq0group]: https://jq.qq.com/?_wv=1027&k=5HPYvQk
10+
11+
12+
<br>
13+
14+
15+
`Java Core Sprout`:处于萌芽阶段的 `Java` 核心知识库。
16+
17+
<br/>
18+
19+
</div>
20+
21+
22+

docs/_coverpage.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
3+
<img src="_media/icon-left-font-monochrome-black.png" width="400" />
4+
5+
6+
> `Java Core Sprout`:处于萌芽阶段的 Java 核心知识库。
7+
8+
[GitHub](https://github.com/crossoverJie/JCSprout)
9+
[Get Started](collections/ArrayList.md)

docs/_media/icon-above-font.png

39.6 KB
Loading
17.2 KB
Loading

docs/_sidebar.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
- 集合
2+
3+
- [ArrayList/Vector](collections/ArrayList.md)
4+
- [LinkedList](collections/LinkedList.md)
5+
- [HashSet](collections/HashSet.md)
6+
- [LinkedHashMap](collections/LinkedHashMap.md)
7+
8+
- Java 多线程
9+
10+
- [多线程中的常见问题](thread/Thread-common-problem.md)
11+
- [synchronized 关键字原理](thread/Synchronize.md)
12+
- [多线程的三大核心](thread/Threadcore.md)
13+
- [对锁的一些认知](thread/Java-lock.md)
14+
- [ReentrantLock 实现原理 ](thread/ReentrantLock.md)
15+
- [ConcurrentHashMap 的实现原理](thread/ConcurrentHashMap.md)
16+
- [如何优雅的使用和理解线程池](thread/ThreadPoolExecutor.md)
17+
- [深入理解线程通信](thread/thread-communication.md)
18+
19+
- JVM
20+
21+
- [Java 运行时内存划分](jvm/MemoryAllocation.md)
22+
- [类加载机制](jvm/ClassLoad.md)
23+
- [OOM 分析](jvm/OOM-analysis.md)
24+
- [垃圾回收](jvm/GarbageCollection.md)
25+
- [对象的创建与内存分配](jvm/newObject.md)
26+
- [你应该知道的 volatile 关键字](jvm/volatile.md)
27+
- [一次内存溢出排查优化实战](jvm/OOM-Disruptor.md)
28+
29+
- 分布式
30+
31+
- [分布式限流](distributed/Distributed-Limit.md)
32+
- [基于 Redis 的分布式锁](distributed/distributed-lock-redis.md)
33+
- [分布式缓存设计](distributed/Cache-design.md)
34+
- [分布式 ID 生成器](distributed/ID-generator.md)
35+
36+
- 常用框架
37+
38+
- [Spring Bean 生命周期](frame/spring-bean-lifecycle.md)
39+
- [Spring AOP 的实现原理](frame/SpringAOP.md)
40+
- [Guava 源码分析(Cache 原理)](frame/guava-cache.md)
41+
- [轻量级 HTTP 框架](frame/cicada.md)
42+
- [Kakfa produce 源码分析](frame/kafka-product.md)
43+
- SpringBoot 启动过程
44+
- Tomcat 类加载机制
45+
46+
- 架构设计
47+
48+
- [秒杀系统设计](architecture-design/Spike.md)
49+
- [秒杀架构实践](architecture-design/seconds-kill.md)
50+
- [设计一个百万级的消息推送系统](architecture-design/million-sms-push.md)
51+
52+
- 数据库
53+
54+
- [MySQL 索引原理](db/MySQL-Index.md)
55+
- [SQL 优化](db/SQL-optimization.md)
56+
- [数据库水平垂直拆分](db/DB-split.md)
57+
58+
- 数据结构与算法
59+
60+
- [常见算法](algorithm/common-algorithm.md)
61+
- [一致性 Hash 算法](algorithm/Consistent-Hash.md)
62+
- [限流算法](algorithm/Limiting.md)
63+
- [动手实现一个 LRU cache](algorithm/LRU-cache.md)
64+
65+
66+
- Netty 相关
67+
68+
- [SpringBoot 整合长连接心跳机制](netty/Netty(1)TCP-Heartbeat.md)
69+
- [从线程模型的角度看 Netty 为什么是高性能的?](netty/Netty(2)Thread-model.md)
70+
71+
- 附加技能
72+
73+
- [TCP/IP 协议](soft-skills/TCP-IP.md)
74+
- [一个学渣的阿里之路](soft-skills/Interview-experience.md)
75+
- [如何成为一位「不那么差」的程序员](soft-skills/how-to-be-developer.md)
76+
- [如何高效的使用 Git](soft-skills/how-to-use-git-efficiently.md)
77+
78+
- [联系作者](contactme.md)

docs/algorithm/Consistent-Hash.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# 一致 Hash 算法
2+
3+
当我们在做数据库分库分表或者是分布式缓存时,不可避免的都会遇到一个问题:
4+
5+
如何将数据均匀的分散到各个节点中,并且尽量的在加减节点时能使受影响的数据最少。
6+
7+
## Hash 取模
8+
随机放置就不说了,会带来很多问题。通常最容易想到的方案就是 `hash 取模`了。
9+
10+
可以将传入的 Key 按照 `index = hash(key) % N` 这样来计算出需要存放的节点。其中 hash 函数是一个将字符串转换为正整数的哈希映射方法,N 就是节点的数量。
11+
12+
这样可以满足数据的均匀分配,但是这个算法的容错性和扩展性都较差。
13+
14+
比如增加或删除了一个节点时,所有的 Key 都需要重新计算,显然这样成本较高,为此需要一个算法满足分布均匀同时也要有良好的容错性和拓展性。
15+
16+
## 一致 Hash 算法
17+
18+
一致 Hash 算法是将所有的哈希值构成了一个环,其范围在 `0 ~ 2^32-1`。如下图:
19+
20+
![](https://ws1.sinaimg.cn/large/006tNc79gy1fn8kbmd4ncj30ad08y3yn.jpg)
21+
22+
之后将各个节点散列到这个环上,可以用节点的 IP、hostname 这样的唯一性字段作为 Key 进行 `hash(key)`,散列之后如下:
23+
24+
![](https://ws3.sinaimg.cn/large/006tNc79gy1fn8kf72uwuj30a40a70t5.jpg)
25+
26+
之后需要将数据定位到对应的节点上,使用同样的 `hash 函数` 将 Key 也映射到这个环上。
27+
28+
![](https://ws3.sinaimg.cn/large/006tNc79gy1fn8kj9kd4oj30ax0aomxq.jpg)
29+
30+
这样按照顺时针方向就可以把 k1 定位到 `N1节点`,k2 定位到 `N3节点`,k3 定位到 `N2节点`
31+
32+
### 容错性
33+
这时假设 N1 宕机了:
34+
35+
![](https://ws3.sinaimg.cn/large/006tNc79gy1fn8kl9pp06j30a409waaj.jpg)
36+
37+
依然根据顺时针方向,k2 和 k3 保持不变,只有 k1 被重新映射到了 N3。这样就很好的保证了容错性,当一个节点宕机时只会影响到少少部分的数据。
38+
39+
### 拓展性
40+
41+
当新增一个节点时:
42+
43+
![](https://ws1.sinaimg.cn/large/006tNc79gy1fn8kp1fc9xj30ca0abt9c.jpg)
44+
45+
在 N2 和 N3 之间新增了一个节点 N4 ,这时会发现受印象的数据只有 k3,其余数据也是保持不变,所以这样也很好的保证了拓展性。
46+
47+
## 虚拟节点
48+
到目前为止该算法依然也有点问题:
49+
50+
当节点较少时会出现数据分布不均匀的情况:
51+
52+
![](https://ws2.sinaimg.cn/large/006tNc79gy1fn8krttekbj30c10a5dg5.jpg)
53+
54+
这样会导致大部分数据都在 N1 节点,只有少量的数据在 N2 节点。
55+
56+
为了解决这个问题,一致哈希算法引入了虚拟节点。将每一个节点都进行多次 hash,生成多个节点放置在环上称为虚拟节点:
57+
58+
![](https://ws2.sinaimg.cn/large/006tNc79gy1fn8ktzuswkj30ae0abdgb.jpg)
59+
60+
计算时可以在 IP 后加上编号来生成哈希值。
61+
62+
这样只需要在原有的基础上多一步由虚拟节点映射到实际节点的步骤即可让少量节点也能满足均匀性。

0 commit comments

Comments
 (0)