當整個城市只有一條主幹道,不管你是上班、回家、買菜,全部擠在同一條路

Sharding 是什麼?他直接多鋪幾條平行道路,每條路有自己的流量上限、有自己的責任區,目的就是不要讓任何一條路成為整座城市的瓶頸,Redis Cluster 會把資料自動 sharding 到多個節點上,讓資料集和負載可以水平擴展

2

分散式的 Redis 就是 Sharding 的概念,Sharding 的本質是為了讓「單台 Redis 永遠只處理自己撐得住的資料量」,不同的 Key/Value 會放到不同的 Redis 機器上,由系統(Redis Cluster)用「Hash」的方式計算放在哪裡

2

資料量與流量逐漸成長過程中,若把所有 key 都丟在同一台,記憶體、單執行緒會被撐滿,因此大流量站台通常架構上會搭配 Sharding ,讓每台 Redis 只負責自己那一部分 key,不共享資料、不互相鎖,Client 或 Redis Cluster 幫你處理 routing,你只管用 key,不用自己寫分配邏輯

2

比如:

1
2
hash("user:1") % 3 = 0 ➜ 放 Redis A
hash("user:2") % 3 = 1 ➜ 放 Redis B
  1. Redis Cluster 先把 key 算到某個 hash slot
  2. 總共有 16,384 個 slots
  3. 每個節點負責其中一部分 slots
  4. 客戶端依 slot 路由到對應節點,或收到 redirect 後重送到正確節點

2

你就算有 10 台 Redis,只要所有人都打同一個 key,還是等於只有一台在撐

1
GET homepage:popularProducts

2

當所有人都打這個 key,結果同一個 Redis node、同一條執行緒、同一把 key 的請求佇列,即使每次 GET 很快,排隊一多就慢,如果還有 SET 更新、快取重建,則讀寫會被序列化,整個 key 卡住

2

解 Hot Key 是「不要讓請求都撞在同一把 key 上」

1
2
GET homepage:popularProducts:groupA
GET homepage:popularProducts:groupB

把資料切成多份(分類 / 區塊 / 隨機),得以讓請求自然分散,如此一來,在 Redis Cluster,不同 key 可能落在不同 node,就算在同一 node ,每把 key 的排隊壓力變小

2

2