css實現左側固定寬度,右側寬度自適應(轉載)
經過上篇文章,介紹了 Redis 中的物件,Redis 是通過這些物件來儲存 Redis 資料庫中的資料的。這篇我們就看一下Redis資料庫在記憶體中的結構,以及客戶端切換資料庫、資料庫儲存鍵值對、以及對資料的增刪改查等操作的實現方法。
我們本地安裝 Redis 會安裝redis-cli 和 redis-server兩個部分,相當於一個Redis的客戶端和服務端。我們通常通過redis-cli來連線redis-server,資料都是存放在redis-server的資料庫中,我們來看一下伺服器中redis-server和Redis資料庫結構。
redis-server
Redis 伺服器將所有資料庫都儲存在結構 redis.h/redisServer 中的 db 陣列中,db 中的每一項都是 redis.h/redisDb 結構,代表一個數據庫。
struct redisServer { // ... // 一個數組,儲存著伺服器中所有資料庫 redisDb *db; // 伺服器中資料庫數量 int dbnum; };
dbnum 屬性由配置項 database 決定。預設情況下為16。
切換資料庫
每個redis-cli都有自己目標資料庫,當客戶端執行資料庫讀或者寫命令時,目標資料庫將成為命令的操作物件。
預設情況下,redis-cli都會連線第0個數據庫,客戶端可以通過 SELECT 命令切換資料庫。如下例子:
嘗試用redis-cli 連線本地redis-server:
訪問被拒絕了,是因為我們沒在本地啟動redis-server。我們啟動並連線本地redis-server:
(上述例子是在macOS系統中,Windows和Linux系統都是大同小異,網上都可以找到解決方案。)
我們連線本地redis-server,並做一些操作:
可以看到,我們現在資料庫0設定language,再切換為資料庫15設定language,儲存了兩個key,說明redis-server中每個資料庫是獨立的。
但是切換資料庫是怎麼做到的呢?我們來看一下redis-cli的結構
typedef struct redisClient { // ... // 記錄當前客戶端正在使用的資料庫 // redisDb *db // ... } redisClient;
redisClient.db 指標指向redisServer.db陣列中的其中一個元素,代表正在連線那個被客戶端指向的資料庫,如下圖例子:
通過修改redisClient.db指標,指向redisServer中不同的資料庫,實現切換資料庫的功能,這就是 SELECT 命令的實現原理。
資料庫鍵空間
Redis 是個鍵值對資料庫,伺服器中的每個資料庫由 redis.h/redisDb 結構表示,其中redisDb中的dict字典儲存了資料庫中的所有鍵值對。
typedef struct redisDb { // ...
// 資料庫鍵空間,儲存著資料庫中所有鍵值對 // dict *dict // ... } redisDb;
鍵空間的鍵就是資料庫的鍵,每一個鍵都是一個字串物件。
鍵空間的值近視資料庫的值,每一個值可以是字串物件、列表物件、雜湊物件、集合物件和有續集合物件中的任意一個。
舉個例子,我們對資料庫執行如下命令:
那麼資料庫鍵值對在記憶體中的結構如下圖所示:
因為資料庫鍵空間就是一個字典,所有對Redis資料庫的增刪改查,相當於對鍵空間(字典)的增刪改查。
參考文獻
Redis設計與實現第二版