首頁 > 軟體

Redis為什麼預設有16個資料庫問題

2023-09-07 10:08:45

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

如下圖所示。

16個資料庫的由來

Redis是一個字典結構的儲存伺服器,一個Redis範例提供了多個用來儲存資料的字典,使用者端可以指定將資料儲存在哪個字典中。

這與在一個關聯式資料庫範例中可以建立多個資料庫類似(如下圖所示),所以可以將其中的每個字典都理解成一個獨立的資料庫。

以MySQL範例為例

Redis預設支援16個資料庫,可以通過調整Redis的組態檔redis/redis.conf中的databases來修改這一個值,設定完畢後重啟Redis便完成設定。

使用者端與Redis建立連線後會預設選擇0號資料庫,不過可以隨時使用SELECT命令更換資料庫。

# 切庫
redis> SELECT 1 # 預設0號db,切換為1號db
OK
redis [1] > GET username # 從1號庫中獲取 username 
(nil)

在實際專案中則可以通過以Redis組態檔的形式指定資料庫,如下圖所示

正確理解Redis的“資料庫”概念

由於Redis不支援自定義資料庫的名字,所以每個資料庫都以編號命名。

開發者則需要自己記錄儲存的資料與資料庫的對應關係。另外Redis也不支援為每個資料庫設定不同的存取密碼,所以一個使用者端要麼可以存取全部資料庫,要麼全部資料庫都沒有許可權存取。

但是,要正確地理解Redis的“資料庫”概念這裡不得不提到一個命令:

# 清空一個Redis範例中所有資料庫中的資料
redis 127.0.0.1:6379> FLUSHALL

該命令可以清空範例下的所有資料庫資料,這與我們所熟知的關係型資料庫所不同。

關係型資料庫多個庫常用於儲存不同應用程式的資料 ,且沒有方式可以同時清空範例下的所有庫資料。所以對於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。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com