93.7% 的程式設計師!竟然都不知道 Redis 為什麼預設16個資料庫?

IT職業頻道發表於2022-12-05

93.7% 的程式設計師!竟然都不知道 Redis 為什麼預設16個資料庫?

▍導讀

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

93.7% 的程式設計師!竟然都不知道 Redis 為什麼預設16個資料庫?

椐調查發現:93.7%的程式設計師!竟然都不知道Redis為什麼預設16個資料庫?


一、16個資料庫的由來


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

93.7% 的程式設計師!竟然都不知道 Redis 為什麼預設16個資料庫?

以MySQL例項為例

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

93.7% 的程式設計師!竟然都不知道 Redis 為什麼預設16個資料庫?


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

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

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

93.7% 的程式設計師!竟然都不知道 Redis 為什麼預設16個資料庫?


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


93.7% 的程式設計師!竟然都不知道 Redis 為什麼預設16個資料庫?

由於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?

93.7% 的程式設計師!竟然都不知道 Redis 為什麼預設16個資料庫?

要注意以上所說的都是基於單體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。
原文:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545820/viewspace-2670873/,如需轉載,請註明出處,否則將追究法律責任。

相關文章