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命令**更換存儲的數據庫。

更換 db

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

配置文件

正解 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。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/8QH0jnB38vrB539h7cdAkA