面試官:Redis為什麼預設16個數據庫? 業餘草
面試官:Redis為什麼預設16個數據庫?
https://mp.weixin.qq.com/s/fmnxJGfEyNRzdWOSQN6BEw
這兩天很心累,一個同學,陸續從我這裡借了幾萬元錢。現在問他要,玩失蹤了。很疼心,哎,人好難。。。
導讀:在實際專案中 Redis 常被應用於做快取,分散式鎖、訊息佇列等。但是在搭建配置好 Redis 伺服器後很多朋友應該會發現和有這樣的疑問,為什麼 Redis 預設建立了 16 個數據庫,如下圖所示。
「一、16個數據庫的由來」
Redis 是一個字典結構的儲存伺服器,一個 Redis 例項提供了多個用來儲存資料的字典,客戶端可以指定將資料儲存在哪個字典中。這與在一個關係資料庫例項中可以建立多個數據庫類似(如下圖所示),所以可以將其中的每個字典都理解成一個獨立的資料庫。
以 MySQL 例項為例。
Redis 預設支援 16 個數據庫,可以通過調整 Redis 的配置檔案redis/redis.conf 中的 databases 來修改這一個值,設定完畢後重啟 Redis 便完成配置。
客戶端與 Redis 建立連線後會預設選擇 0 號資料庫,不過可以隨時使用 SELECT 命令更換資料庫。
在實際專案中則可以通過以 Redis 配置檔案的形式指定資料庫,如下圖所示
「二、正確理解 Redis 的“資料庫”概念」
由於 Redis 不支援自定義資料庫的名字,所以每個資料庫都以編號命名。開發者則需要自己記錄儲存的資料與資料庫的對應關係。另外 Redis 也不支援為每個資料庫設定不同的訪問密碼,所以一個客戶端要麼可以訪問全部資料庫,要麼全部資料庫都沒有許可權訪問。但是,要正確地理解 Redis 的“資料庫”概念這裡不得不提到一個命令:
該命令可以清空例項下的所有資料庫資料,這與我們所熟知的關係型資料庫所不同。關係型資料庫多個庫常用於儲存不同應用程式的資料 ,且沒有方式可以同時清空例項下的所有庫資料。所以對於 Redis 來說這些 db 更像是一種名稱空間,且不適宜儲存不同應用程式的資料。比如可以使用 0 號資料庫儲存某個應用生產環境中的資料,使用 1 號資料庫儲存測試環境中的資料,但不適宜使用 0 號資料庫儲存A應用的資料而使用 1 號資料庫B應用的資料,不同的應用應該使用不同的 Redis 例項儲存資料。Redis 非常輕量級,一個空 Redis 例項佔用的內在只有 1M 左右,所以不用擔心多個 Redis 例項會額外佔用很多記憶體。
「三、叢集情況下是否支援一個例項多個db?」
要注意以上所說的都是基於單體 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。
以上,便是今天的分享,希望大家喜歡,覺得內容不錯的,歡迎點選「「在看」」支援,謝謝各位!