事情發生在一個普通得不能再普通的週二。

我坐在一家準備接入千萬級流量的公司會議室裏,喝着他們的免費美式(講真,很難喝),對面是一個技術面試官,眼神平靜,嘴角帶點殺氣。

他翻了翻簡歷,問:小米啊,Redis 分片你瞭解幾種?

我一愣,下意識條件反射:“客户端分片、代理分片、Redis Cluster。”

他點了點頭,然後抬頭,那你重點説説:基於代理服務器的分片?

空氣瞬間凝固。我腦子裏閃過一堆:Twemproxy、Codis、Proxy層……但如何系統地講清楚?

這,就是今天這篇文章要陪你拆的重點。

為什麼會有“代理服務器分片”這種東西?

很多人學 Redis 分片,上來就是:

  • 一致性哈希
  • slot slot slot
  • cluster gossip

但其實,我們得先回到一個非常現實的問題:如果你有 3 台 Redis,你怎麼讓上百個業務方用它們?

你有兩個選擇,其中一個就是所有客户端自己算,也就是所謂的:客户端分片!

每個客户端要知道:

  • 有幾台Redis
  • 每台Redis負責哪些key
  • 如何取模 / 一致性哈希

問題是什麼?

  • 客户端SDK要升級
  • 分片規則變了,所有客户端都要改
  • 運維混亂,擴容困難

於是,人類就發明了一個“中間商”。

代理服務器分片,就是Redis世界的“中介所”

所謂基於代理服務器的分片,其實一句話講清楚:

在客户端和 Redis 之間,加一個“代理服務器”,所有請求都先經過它,由它負責分片和轉發。

架構簡圖你腦補一下:

從懵逼到自信:Redis 基於代理分片一篇搞懂_客户端

客户端不需要關心:

  • 後端有幾台Redis
  • 使用什麼分片規則
  • 是否擴容 / 遷移

它只管一件事:找 Proxy,發命令。分片的事情,代理幫你搞定。

代理分片解決了什麼核心問題?

你可以理解為,Proxy 做了四件事:

1、統一入口

所有客户端,只對接一個地址或域名,比如:redis://proxy.company.com:6379

後面Redis怎麼變,客户端完全不用改。

2、分片路由

Proxy 內部會有一套路由規則:

  • 按 key hash
  • 按槽 slot
  • 按業務前

比如:

從懵逼到自信:Redis 基於代理分片一篇搞懂_客户端_02

路由邏輯統一由 Proxy 管理。

3、支持擴容 & 遷移

當你 Redis 擴容到 5 台、10 台:

  • 客户端不用管
  • Proxy 更新路由方案
  • 後台慢慢做數據遷

在業務側幾乎無感。這在大型系統裏非常重要。

4、屏蔽複雜性

客户端只當 Redis 是“一個大緩存池”,而不是一堆七零八落的小緩存機。對業務開發來説,體驗極佳。

常見的代理分片中間件有哪些?

面試官極愛問!!!必須能説出幾個典型代表:

1. Twemproxy(nutcracker)

特點:

  • Twitter 開源
  • 性能不錯
  • 輕量級
  • 不支持複雜命令(比如事務、pipeline受限)

缺點:

  • 功能偏簡單
  • 不支持複雜的 cluster 管理

適合:

  • 高併發但功能要求相對簡單的場景。

2. Codis(國內超常用)

這個真的要重點講,面試非常加分。

Codis 是豌豆莢開源的 Redis 分佈式解決方案。

組成包括:

  • Codis Proxy
  • Codis Dashboard
  • Codis Server
  • Zookeeper / ETCD

它的架構是:

代理轉發 + Slot 分片 + 可視化管理 + 自動遷移

Codis 的核心亮點:

  • 支持在線擴容
  • 支持動態遷移
  • 對客户端完全透明
  • 運維友好

很多互聯網公司生產環境都有用過。

代理分片 VS 客户端分片:面試重點對比

你在面試時可以這樣優雅對比:

從懵逼到自信:Redis 基於代理分片一篇搞懂_Redis_03

一句總結送你:

客户端分片是“人人自己導航”,代理分片是“統一交通指揮中心”。

面試官一聽就笑了。

那代理分片有沒有缺點?

當然有,技術世界沒有銀彈。

代理分片的幾個典型問題:

1. 多了一跳網絡

  • 客户端 → Proxy → Redis
  • 必然會比直連 Redis 多一次網絡開銷。
  • 在超低延遲場景,需要謹慎。

2. Proxy 本身可能成為瓶頸

如果:

  • Proxy 掛了
  • Proxy 性能不夠
  • Proxy 成為單點

那整個 Redis 服務就容易出事故。所以,代理服務也要:高可用、集羣化、多副本。

3. 某些指令支持有限

比如涉及多個 key 的:

  • MGET
  • 事務
  • Lua腳本

如果 key 分佈在不同分片,Proxy 要處理就很難。Codis 是通過限制或特殊優化來解決部分問題的。

真實面試中,你可以怎麼回答?

如果讓我回到那天的面試現場,我會這樣説(你可以直接背):

面試官問:“你説説什麼是基於代理服務器的分片?”

我淡定回答:

基於代理服務器的Redis分片,是在客户端和多個Redis實例之間,引入一個代理層,由代理服務器統一接收請求,通過預設的分片規則對key進行路由轉發,從而屏蔽後端多個Redis節點的複雜性。

客户端只需要連接代理地址,不需要感知具體的Redis分佈,同時方便後期動態擴容和數據遷移,運維成本也更低。

常見實現有 Twemproxy 和 Codis,其中 Codis 支持slot遷移、在線擴容,生產中比較常見。

然後,看面試官的表情:從懷疑人生,變成輕輕點頭。

一個真實運維故事:擴容那一夜

讓我再給你講個打工人真實故事。

某天下午,我們業務突然增長,Redis 內存飆到 80%,眼看要爆。如果是客户端分片,我們要:

  • 改配置
  • 灰度發版
  • 客户端升級
  • 協調幾十個服務

但我們用的是:Codis。運維僅做了三件事:

  • 加機器
  • 在 Codis Dashboard 點擊擴容
  • 看着 slot 慢慢遷移

業務幾乎無感。那一刻,我發誓:

代理分片,是救命神器。

總結

最後我給你濃縮一波精華,你可以直接放到你的腦內小本本~

核心關鍵詞:

  • Proxy轉發
  • 統一入口
  • 路由分片
  • slot遷移
  • 擴容無感
  • 常見:Codis、Twemproxy

一句話總結:

代理服務器分片,本質是通過引入中間層,把Redis分佈式複雜性從客户端轉移到代理層,讓業務更專注,架構更清晰,擴展更便捷。

END

如果你正在準備社招面試,希望這篇“代理分片小故事”能幫你把 Redis 這道題,從模糊講到清晰,從被問住,變成反問面試官。

我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!