Redis爲什麼要分16個庫

前言

在實際的項目中,Redis常被用作緩存、分佈式鎖、消息隊列等的解決方案。但是在搭建好Redis服務後,Redis默認創建了16個數據庫(db0~db15),而在Redis集羣下只有一個db0數據庫。如下圖所示。

一、16個數據庫的由來

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

我們講過Redis默認支持16個數據庫,這可以通過修改Redis的配置文件/redis/redis.conf中的databases字段的值,設置完畢並重啓Redis即可完成配置。

此外,客戶端與Redis建立連接之後,默認會選擇0號數據庫即db0,但可以使用select命令更換存儲的數據庫。

也可以通過修改配置文件的方式選擇默認數據庫。

二、正解Redis數據庫概念

可以看到,Redis的數據庫都以db+編號的方式命名,這是因爲Redis不支持自定義數據庫名。開發者則需要自己記錄存儲的數據與數據庫之間的對應關係。此外,Redis不支持爲每個數據庫設置不同的訪問密碼,即客戶端要麼可以訪問全部的數據庫,要麼所有的數據庫都不能被訪問。

Redis中存在這麼一個命令flushall,該命令可以清空當前Redis實例下所有數據庫的數據。這與類似於mysql的關係型數據庫不同,關係型數據庫的每個數據庫常用於存儲不同應用程序的數據,且不提供清除當前實例下所有數據庫數據的方法。

因此,對於Redis來說,用命名空間的方式理解Redis提供的db0~db15數據庫會更合適,且一個Redis實例不適合存儲多個應用程序的數據。比如,我們可以這麼做:使用db0數據庫存儲應用程序在生產環境的數據,用db1數據庫存儲測試環境的數據。但是,不適合用db0數據庫存儲應用程序A的數據,用db1存儲應用程序B的數據。****不同的應用程序應使用不同的Redis實例。此外,我們不必擔心使用過多的Redis實例造成數據庫服務壓力過大,因爲Redis是非常輕量級的,一個空的Redis實例佔用的內存只有1MB左右。

三、集羣環境下的Redis實例

在單體Redis的情況下可以使用select命令來實現數據庫的切換,但在集羣環境下,Redis不支持使用select命令來切換數據庫,這是因爲在集羣環境下只有一個db0數據庫。集羣與單體Redis的區別如下:

1、key批量操作支持有限:例如mget、mset必須在一個slot;
2、Key事務和Lua支持有限:操作的key必須在一個節點;
3、key是數據分區的最小粒度:不支持bigkey分區;
4、不支持多個數據庫:集羣模式下只有一個db0;
5、複製只支持一層:不支持樹形複製結構。

四、總結

  • Redis實例默認創建了16個數據庫,且不支持自定義命名,以dbX的方式命名(db0~db15);
  • 默認數據庫的數量可以在配置文件中修改;
  • 應以命名空間的方式理解Redis數據庫db,多個應用程序不應使用同一個Redis的不同庫,而應一個應用程序對應一個Redis實例,不同的數據庫可用於存儲不同環境的數據。
  • Redis集羣下只有db0,不支持多db。

作者:胸毛飄逸
鏈接:https://www.jianshu.com/p/acfbcc74b701
來源:簡書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章