那是一個普通得不能再普通的下午。我端着一杯已經涼了的美式,坐在視頻面試前,心想:

“Redis 我天天用,緩存、分佈式鎖、限流、秒殺,閉着眼都能聊。”

面試官一開口也很友好:

“Redis 用得多吧?”

我自信點頭。

“那我問個簡單點的,Redis 為什麼設計了 16 個數據庫?”

我愣住了。不是因為不會用 Redis,而是因為我從來沒認真想過這個問題。

我腦子裏飛快地閃過無數場景:

  • select 0
  • select 1
  • 配置文件裏的 databases 16
  • 面試題裏偶爾出現的“多庫隔離”

但“為什麼是 16”,不是 8,也不是 32,更不是 1?

那一刻,我感覺自己像一個每天開車上下班,卻突然被問:

“方向盤為什麼是圓的?”

先別急,咱把 Redis 的「16 庫」當成一棟公寓

在解釋技術之前,我想先講個更生活化的故事。假設你是房東,買了一棟 16 層的小公寓

  • 每一層都有獨立的房門
  • 每一層都能住人
  • 但這 不是 16 棟樓,而是 一棟樓的 16 層

這棟樓有幾個特點:

  1. 水電是共用的
  2. 電梯是同一部
  3. 承重結構是一樣的

Redis 的 16 個庫,本質上就是這棟樓裏的 16 層。它們:

  • 邏輯上隔離
  • 物理上共享同一塊內存、同一個進程

很多人一聽“16 個數據庫”,就誤以為:

“哇,那是不是和 MySQL 一樣?隔離得很徹底?”

不不不。Redis 設計這 16 個庫,從一開始就沒打算讓你拿它當關系型數據庫來用。

Redis 的數據庫,到底是個什麼東西?

先看一眼 Redis 的配置文件:

用了十年 Redis,我第一次認真思考“16 個庫”這件事_Redis

啓動 Redis 後,默認就在 0 號庫

用了十年 Redis,我第一次認真思考“16 個庫”這件事_Redis_02

切換數據庫:

用了十年 Redis,我第一次認真思考“16 個庫”這件事_數據庫_03

每個庫:

  • 都有自己的一套 key
  • key 之間互不衝突
  • 內存是共享的

我們可以用一個簡單示例感受一下:

用了十年 Redis,我第一次認真思考“16 個庫”這件事_Redis_04

結果是:

用了十年 Redis,我第一次認真思考“16 個庫”這件事_多實例_05

看起來很像“隔離”。但別高興太早。這個問題,才是面試官真正想聽的。

歷史原因:最初只是一個“夠用就好”的設計

Redis 最早的目標非常簡單:

快、輕、單線程、內存級

它並不是為了做複雜的多租户數據庫。16 這個數字,在工程裏是個很微妙的存在:

  • 是 2 的冪
  • 二進制友好
  • 足夠做簡單隔離
  • 又不會讓管理複雜度爆炸

在 Redis 作者的思路里:

“你最多也就用幾個庫,16 個,綽綽有餘。”

而事實證明大部分人,連第 1 個庫都沒用完。

工程現實:多庫 ≠ 多實例

這是一個非常重要、卻常被忽略的點。

用了十年 Redis,我第一次認真思考“16 個庫”這件事_多實例_06

Redis 的 16 個庫:

  • 沒有內存配額
  • 沒有 QPS 限流
  • 沒有權限隔離

如果 0 號庫被一個大 Key 撐爆了內存,1~15 號庫一起陪葬。所以 Redis 從來沒打算:

“讓你用數據庫編號做強隔離。”

那為什麼不是 32、64,甚至 256?

這是很多人面試時會追問的一刀。答案其實很工程化:

Redis 作者的核心取捨是——簡單優先

  • 每多一個庫
  • 就多一份維護成本
  • 多一層心智負擔
  • 多一個潛在誤用場景

而 Redis 的定位非常清晰:一個實例 = 一個邏輯服務

如果你真的需要:

  • 嚴格隔離
  • 不同配置
  • 不同持久化策略

Redis 給你的答案不是:“多用幾個庫”,而是:

多起幾個 Redis 實例

一個你可能不知道的真相:Redis 官方並不鼓勵你用多庫

這個點,在社招面試裏屬於加分項。你可以這麼説:

Redis 雖然支持 16 個數據庫,但在生產環境中,官方和社區更推薦 一個實例只用一個庫,通過 key 命名空間多實例 來做隔離。

舉個例子:

用了十年 Redis,我第一次認真思考“16 個庫”這件事_多實例_07

而不是:

用了十年 Redis,我第一次認真思考“16 個庫”這件事_多實例_08

為什麼?

  • Cluster 模式 不支持多庫
  • 遷移、擴容、監控更簡單
  • 避免 select 帶來的隱式狀態問題

面試官真正想考你的,其實不是“16”

我後來覆盤那次面試,才意識到:面試官根本不在乎你記不記得 16,他在乎的是:你有沒有工程思維

他想聽的,往往是這些點:

  1. Redis 的多庫是邏輯隔離
  2. 共享內存、共享進程
  3. 不適合做強隔離
  4. 更推薦多實例或 key 前綴
  5. Cluster 下直接廢掉

如果你能把這些串起來講,“16”只是一個引子。

一個面試級回答模板(你可以直接背)

Redis 設計 16 個數據庫,主要是為了提供一種輕量級的邏輯隔離手段,滿足簡單場景下的 key 分類需求。

但這些數據庫並不是物理隔離的,它們共享同一個進程和內存,因此不適合用於多租户或強隔離場景。

在生產環境中,Redis 官方和社區更推薦使用單庫,通過 key 前綴或多實例的方式進行隔離。

同時,在 Redis Cluster 模式下已經不支持多數據庫,這也進一步説明多庫並不是 Redis 的核心設計方向。

説完這段,面試官大概率會點頭。

寫在最後:別被“簡單問題”騙了

Redis 為什麼是 16 個庫?這個問題,看起來簡單,但背後藏的是:

  • 設計哲學
  • 工程取捨
  • 真實生產經驗

很多社招面試題,問的從來不是“你記住了多少”,而是:你有沒有真的用腦子思考過技術為什麼這樣設計。

如果你也曾在面試裏被這種問題“卡殼”,別慌。下一次,你就可以像個老司機一樣,慢慢講,講清楚,講到位。

END

我是小米!我們,下篇再見。

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