Redis面試題-Redis 16個資料庫

haicoder_ibai發表於2021-04-04

本文參考 嗨客網 Redis面試題

描述

在實際專案中 Redis 常被應用於做快取,分散式鎖、訊息佇列等。但是在搭建配置好 Redis 伺服器後很多朋友應該會發現和有這樣的疑問,為什麼 Redis 預設建立了 16 個資料庫。

檢視Redis資料庫

我們在使用 redis-cli 連線到 Redis 伺服器時,可以使用 SELECT 命令切換 Redis 的庫,比如我們切換到第 16 號庫,具體命令如下:

SELECT 15

執行完畢後,終端輸出如下:

嗨客網(www.haicoder.net)

我們看到,Redis 的提示符前面顯示 [15] 表明我們已經切換到了第 16 號庫,現在,我們再次切換到第 10 號庫,具體命令如下:

SELECT 11

執行完畢後,終端輸出如下:

嗨客網(www.haicoder.net)

我們看到,現在我們切換到了第 11 號庫,我們切換一個不存在的庫,執行完畢後,終端輸出如下:

嗨客網(www.haicoder.net)

我們看到,此時提示我們資料庫不存在。

16個資料庫的由來

Redis 是一個字典結構的儲存伺服器,一個 Redis 例項提供了多個用來儲存資料的字典,客戶端可以指定將資料儲存在哪個字典中。這與在一個關聯式資料庫例項中可以建立多個資料庫類似,所以可以將其中的每個字典都理解成一個獨立的資料庫。

Redis 預設支援 16 個資料庫,可以通過調整 Redis 的配置檔案 redis.conf 中的 databases 來修改這一個值,設定完畢後重啟 Redis 便完成配置,具體配置如下:

客戶端與 Redis 建立連線後會預設選擇 0 號資料庫,不過可以隨時使用 SELECT 命令更換資料庫如上操作所示。

Redis的“資料庫”概念

由於 Redis 不支援自定義資料庫的名字,所以每個資料庫都以編號命名。開發者則需要自己記錄儲存的資料與資料庫的對應關係。另外 Redis 也不支援為每個資料庫設定不同的訪問密碼,所以一個客戶端要麼可以訪問全部資料庫,要麼全部資料庫都沒有許可權訪問。但是,要正確地理解 Redis 的 “資料庫” 概念這裡不得不提到一個命令:

redis 127.0.0.1:6379> FLUSHALL

該命令可以清空例項下的所有資料庫資料,這與我們所熟知的關係型資料庫所不同。關係型資料庫多個庫常用於儲存不同應用程式的資料 ,且沒有方式可以同時清空例項下的所有庫資料。

所以對於 Redis 來說這些 db 更像是一種名稱空間,且不適宜儲存不同應用程式的資料。比如可以使用 0 號資料庫儲存某個應用生產環境中的資料,使用 1 號資料庫儲存測試環境中的資料,但不適宜使用 0 號資料庫儲存 A 應用的資料而使用 1 號資料庫 B 應用的資料,不同的應用應該使用不同的 Redis 例項儲存資料。Redis 非常輕量級,一個空 Redis 例項佔用的內在只有 1M 左右,所以不用擔心多個 Redis 例項會額外佔用很多記憶體。

叢集

要注意以上所說的都是基於單體 Redis 的情況。而在叢集的情況下不支援使用 SELECT 命令來切換 db,因為 Redis 叢集模式下只有一個 db0。再擴充套件一些叢集與單機 Reids 的區別:

  • KEY 批量操作支援有限:例如 mget、 mset 必須在一個 slot

  • KEY 事務和 Lua 支援有限:操作的 KEY 必須在一個節點

  • KEY 是資料分割槽的最小粒度:不支援 bigkey 分割槽

  • 不支援多個資料庫:叢集模式下只有一個 db0

  • 複製只支援一層:不支援樹形複製結構

總結

Redis 例項預設建立了 16 個db,由於不支援自主進行資料庫命名所以以 dbX 的方式命名。預設資料庫數量可以修改配置檔案的 database 值來設定。

對於 db 正確的理解應為 “名稱空間”,多個應用程式不應使用同一個 Redis 不同庫,而應一個應用程式對應一個 Redis 例項,不同的資料庫可用於儲存不同環境的資料。最後要注意,Redis 叢集下只有 db0,不支援多 db。

更多

原文連結連結

其他目錄

更多文章,可以關注公眾號:嗨客網IT教程

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章