### 為什么要使用hash算法
> 在分布式系統中,為了提高吞吐量,集群是一個常見的手段,
> 為了保證訪問集群中節點達到一個均衡的效果,就需要采用一些算法【輪詢法】【隨機法】【hash】【加權輪詢】【加權隨機】【最小連接數】
#### 以redis集群為例:
> 假設集群有4個節點,那么hash算法為:hash值 % 4,余數即為需要訪問的節點。假設 hash值 % 4 = 2 那么就指向2號節點(0,1,2,3)。
#### hash算法的問題:
> 如果在4個節點的情況下,增加一個節點,那么算法為:hash值 % 5 那么,之前計算的結果就發生了變動,無法找到原來訪問的節點了。
> 當大量的訪問都找不到原來的節點,那么就會直接查數據庫,造成緩存雪崩
### 一致性hash算法
#### 一致性hash算法介紹
> 一致性hash算法也是采用取模的方法,只是取模的分母不是節點數,而是固定的 2^32,這樣所有的對象取模結果永遠是一樣的。
> hash取模結果就一定會在這個`hash環`上的一點,整個空間按順時針方向組織。

#### 怎么找到對應的服務器
> 將服務器的ip或者主機名也通過 2^32進行取模,那么服務器也一定會落在這個hash環上,如圖:

> 然后通過對象的hash結果,順時針找,碰到的第一個服務器節點,就是分配的服務器,如圖
> ObjectA-> NodeA ObjectB->NodeB ObjectC->NodeC ObjectD->NodeD

#### 擴容,縮容是怎么操作的呢
> `擴容`
> 假設增加一個節點,那么這個節點到逆時針的節點之間的對象都會指向該新的服務器

> `縮容`
> 假設移除一個節點,那么這個節點到沿著逆時針方向的那個節點之間的對象都會被指向到該移除的服務器的順時針的下一個服務器
#### hash傾斜問題
> 原因:節點經過hash算法之后,并不會均衡的分布在hash環上,這就會導致這些節點分配的對象不均衡

> 解決辦法:每個節點增加多個虛擬節點,這樣就會盡量讓節點均衡

- 虛擬機
- JVM內存結構
- JVM調優手段
- java對象生命周期
- 垃圾回收判斷對象死亡
- 垃圾回收算法
- 垃圾收集器
- JAVA基礎知識
- java事件機制
- java反射機制
- jvm創建對象
- java異常
- finally語句一定會執行嗎?
- 集合類介紹
- ArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
- 多線程
- 為什么要使用線程池
- 線程死鎖
- 死鎖檢測和解除
- jstack
- jconsole
- 死鎖預防
- 常見線程池
- 線程池參數
- 工作隊列介紹
- 拒絕策略
- ThreadLocal
- CAS
- ReentrantLock
- AQS
- CountDownLatch
- Spring
- spring中bean的作用域
- REDIS
- redis數據結構
- redis hash實現
- redis rehash與hashmap擴容的區別
- Redis使用場景
- Redis為何這么快
- redis連接數不足導致錯誤
- 分布式
- 分布式事務
- ACID
- CAP
- BASE
- 事務隔離性
- 一致性哈希算法
- 負載均衡算法
- Hystrix 信號量和線程池隔離的差異
- Spring Cloud
- eureka
- MYSQL
- mysql優化經驗
- undo redo binlog
- web
- http協議
- http和https區別
- Cookie和session
- TCP三次握手、4次揮手
- TCP的time_wait和close_wait
- 算法問題
- 編輯距離算法
- MQ
- RabbitMq
- Kafka
- 安裝教程
- Win ELK安裝