1. 程式人生 > >Redis之物件篇——Redis物件系統簡介

Redis之物件篇——Redis物件系統簡介

Redis之物件篇——Redis物件系統簡介

前言

    之前幾篇文章,簡單介紹 Redis用到的所有主要資料結構,簡單動態字串(SDS)、雙端連結串列、字典、壓縮列表、整數集合、跳躍表。

圖解Redis之資料結構篇——簡單動態字串SDS

圖解Redis之資料結構篇——連結串列

圖解Redis之資料結構篇——字典

圖解Redis之資料結構篇——跳躍表

圖解Redis之資料結構篇——整數集合

圖解Redis之資料結構篇——壓縮列表

    Redis並沒有直接使用這些資料結構來實現鍵值對資料庫,而是基於這些資料結構建立了一個物件系統,這個系統包含字串物件、列表物件、雜湊物件、集合物件和有序集合物件這五種型別的物件,而每種物件又通過不同的編碼對映到不同的底層資料結構。

一、Redis物件型別和編碼

    Redis中的每個物件都由一個redisObject結構表示,該結構中和儲存資料有關的三個屬性分別是type屬性、 encoding屬性和ptr屬性:

    Redis使用物件來表示資料庫中的鍵和值,每次當我們在Redis的資料庫中新建立一個鍵值對時,我們至少會建立兩個物件,一個物件用作鍵值對的健(鍵物件),另一個物件用作鍵值對的值(值物件)。

typedef struct redisObiect{
    //型別
    unsigned type:4;
    //編碼
    unsigned encoding:4;
    //指向底層資料結構的指標
    void *ptr;
}

    其中Redis的鍵物件都是字串物件,而Redis的值物件主要有字串、雜湊、列表、集合、有序集合幾種。其分別對應的內部編碼和底層資料結構如下圖所示:

二、思考一個問題

    Redis中的物件,大都是通過多種資料結構來實現的,為什麼會這樣設計呢?用一種固定的資料結構來實現,不是更加簡單嗎?

Redis這樣設計有兩個好處:

  1. 可以自由改進內部編碼,而對外的資料結構和命令沒有影響,這樣一旦開發出更優秀的內部編碼,無需改動外部資料結構和命令,例如Redis3.2提供了quicklist,其結合了ziplist和linkedlist兩者
    的優勢,為列表型別提供了一種更為優秀的內部編碼實現,而對外部使用者來說基本感知不到。 這一點比較像程式設計中的分層架構。
  2. 多種內部編碼實現可以在不同場景下發揮各自的優勢,從而優化物件在不同場景下的使用效率。例如ziplist比較節省記憶體,但是在列表元素比較多的情況下,效能會有所下降,這時候Redis會根據配置選項將列表型別的內部實現轉換linkedlist。 (後續文章將根據具體物件介紹)

本文重點

  • Redis基於底層的一些資料結構建立了一個物件系統以供使用者使用
  • 這個系統主要包含字串物件、列表物件、雜湊物件、集合物件和有序集合物件
  • Redis的鍵物件都是字串物件
  • Redis的值物件主要有字串、雜湊、列表、集合、有序集合幾種
  • 為了可以自由改進內部編碼,以及在不同場景下發揮其最大優勢,Redis中的物件,大都是通過多種資料結構來實現

參考

《Redis設計與實現》

《Redis開發與運維》

《Redis官方文件》

-----END---