12.25 90%的程序員!怎麼都不知道Redis默認16個數據庫?

本文閱讀需要5分鐘。。
在實際項目中Redis常被應用於做緩存,分佈式鎖、消息隊列等。但是在搭建配置好Redis服務器後很多朋友應該會發現和有這樣的疑問,為什麼Redis默認建立了16個數據庫,如下圖所示。

90%的程序員!怎麼都不知道Redis默認16個數據庫?

椐調查發現:93.7%的程序員!竟然都不知道Redis為什麼默認16個數據庫?

一、16個數據庫的由來

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

90%的程序員!怎麼都不知道Redis默認16個數據庫?

以MySQL實例為例

Redis默認支持16個數據庫,可以通過調整Redis的配置文件redis/redis.conf中的databases來修改這一個值,設置完畢後重啟Redis便完成配置。

90%的程序員!怎麼都不知道Redis默認16個數據庫?

客戶端與Redis建立連接後會默認選擇0號數據庫,不過可以隨時使用SELECT命令更換數據庫。

90%的程序員!怎麼都不知道Redis默認16個數據庫?

在實際項目中則可以通過以Redis配置文件的形式指定數據庫,如下圖所示

90%的程序員!怎麼都不知道Redis默認16個數據庫?

二、正確理解Redis的“數據庫”概念

90%的程序員!怎麼都不知道Redis默認16個數據庫?

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

90%的程序員!怎麼都不知道Redis默認16個數據庫?

該命令可以清空實例下的所有數據庫數據,這與我們所熟知的關係型數據庫所不同。關係型數據庫多個庫常用於存儲不同應用程序的數據 ,且沒有方式可以同時清空實例下的所有庫數據。所以對於Redis來說這些db更像是一種命名空間,且不適宜存儲不同應用程序的數據。比如可以使用0號數據庫存儲某個應用生產環境中的數據,使用1號數據庫存儲測試環境中的數據,但不適宜使用0號數據庫存儲A應用的數據而使用1號數據庫B應用的數據,不同的應用應該使用不同的Redis實例存儲數據。Redis非常輕量級,一個空Redis實例佔用的內在只有1M左右,所以不用擔心多個Redis實例會額外佔用很多內存。

三、集群情況下是否支持一個實例多個db?

90%的程序員!怎麼都不知道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。

轉發本文+關注並私信小編:“資料”即可免費領取405集全套python視頻教程哦!

點我頭像就能看到私信選項,極速版沒這個功能,普通版才有

90%的程序員!怎麼都不知道Redis默認16個數據庫?


90%的程序員!怎麼都不知道Redis默認16個數據庫?


分享到:


相關文章: