以前幾篇文章,簡單介紹 Redis用到的全部主要數據結構,簡單動態字符串(SDS)、雙端鏈表、字典、壓縮列表、整數集合、跳躍表。html
圖解Redis之數據結構篇——簡單動態字符串SDSredis
Redis並無直接使用這些數據結構來實現鍵值對數據庫,而是基於這些數據結構建立了一個對象系統,這個系統包含字符串對象、列表對象、哈希對象、集合對象和有序集合對象這五種類型的對象,而每種對象又經過不一樣的編碼映射到不一樣的底層數據結構。優化
Redis中的每一個對象都由一個redisObject結構表示,該結構中和保存數據有關的三個屬性分別是type屬性、 encoding屬性和ptr屬性:ui
Redis使用對象來表示數據庫中的鍵和值,每次當咱們在Redis的數據庫中新建立一個鍵值對時,咱們至少會建立兩個對象,一個對象用做鍵值對的健(鍵對象),另外一個對象用做鍵值對的值(值對象)。編碼
typedef struct redisObiect{ //類型 unsigned type:4; //編碼 unsigned encoding:4; //指向底層數據結構的指針 void *ptr; }
其中Redis的鍵對象都是字符串對象,而Redis的值對象主要有字符串、哈希、列表、集合、有序集合幾種。其分別對應的內部編碼和底層數據結構以下圖所示:
Redis中的對象,大都是經過多種數據結構來實現的,爲何會這樣設計呢?用一種固定的數據結構來實現,不是更加簡單嗎?
Redis這樣設計有兩個好處:
《Redis設計與實現》
《Redis開發與運維》
《Redis官方文檔》