1. 程式人生 > 實用技巧 >css實現左側固定寬度,右側寬度自適應(轉載)

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設計與實現第二版