Redis物件系統

2021-08-11 09:15:31 字數 3348 閱讀 7925

在上一節學習redis中的六種基礎資料結構,但在redis中並沒有直接使用以上的資料結構實現鍵值對資料庫,而是基於這些資料結構構建了乙個物件系統:字串物件(string)、列表物件(list)、雜湊物件(hash)、集合物件(set)和有序集合物件(zset)。對於redis資料庫,鍵總是乙個字串物件,而值則可以是字串物件、列表物件、雜湊物件、集合物件或者有序集合物件中的一種。

使用物件系統的好處:

(1)在執行命令時,根據物件型別判斷乙個物件是否可以執行給定的命令;

(2)針對不同的使用場景,為物件設定多種不同的資料結構,從而優化物件在不同場景下的使用效率;

(3)基於物件引用計數技術實現記憶體的**;

(4)通過引用計數技術實現物件的共享;

在redis中每個物件都由乙個redisobject結構表示:

/*

* redis 物件

*/typedef struct redisobject robj;

redisobject的型別字段:

redisobject的編碼字段:

redisobject不同型別和編碼的物件:

一、字串物件(string)

由上表可知,string物件的編碼可以是int、embstr、raw。根據string物件儲存值的不同,其使用的編碼也不同:

1、如果儲存的是整數值,並且這個整數值可以用long型別來表示,則整數值會儲存在字串物件結構中的ptr屬性裡(void * 轉換為long),並將字串物件的編碼設定為int。

2、如果儲存的是字串值,並且這個字串值長度小於等於39位元組,則字串物件使用embstr編碼儲存。

3、如果儲存的是字串值,並且這個字串值長度大於39位元組,則字串使用raw編碼儲存。

embstr與raw編碼的區別是什麼呢?(a)建立embstr編碼字串記憶體分配1次,建立raw字串記憶體分配2次;

(b)釋放embstr編碼的字串呼叫記憶體釋放函式1次,釋放raw編碼的字串呼叫記憶體釋放函式2次;

(c)embstr編碼的字串物件的所有資料都儲存在一塊連續的記憶體裡面,可以更好的利用快取帶來的優勢;

為什麼是39個位元組呢?embstr是一塊連續的記憶體區域,由redisobject和sdshdr組成。其中redisobject佔16個位元組,當buf內的字串長度是39時,sdshdr的大小為8+39+1=48,那乙個位元組是'\0'。加起來剛好64。(更詳細的講解可以參見知乎@lhcpig的解答)

window環境下,在本地啟動redis-server.exe,然後另啟動乙個redis-cli.exe。對string物件的操作如下:

二、列表物件(list)

列表物件的編碼可以是ziplist或者linkedlist。ziplist使用壓縮列表作為底層實現,linkedlist使用雙端鍊錶作為底層實現。根據列表中存放的值不同,編碼也有所不同:

當列表物件所儲存的所有字串元素長度都小於64位元組,並且元素數量小於512個,列表使用ziplist編碼。不滿足這兩個條件的列表物件需要使用linkedlist編碼。

三、雜湊物件(hash)

雜湊物件的編碼可以是ziplist或者是hashtable。ziplist底層使用壓縮列表實現,而hashtable底層使用字典實現。根據雜湊物件存放的值不同,所使用的編碼也不同:

當雜湊物件儲存的所有鍵值對的鍵和值的字串長度都小於64位元組,並且鍵值對數量小於512個,雜湊物件使用ziplist編碼。不滿足以上兩個條件的雜湊物件使用hashtable編碼。

四、集合物件(set)

集合物件的編碼可以是intset或者hashtable。intset底層使用的是整數集合實現,hashtable底層使用字典實現。根據集合物件存放的值不同,集合物件所使用的編碼也不相同:

當集合物件儲存的所有元素都是整數值,並且物件儲存的元素數量不超過512個,集合物件使用intset編碼。不滿足以上條件的使用hashtable編碼。

五、有序集合物件(zset)

有序集合的編碼可以是ziplist或者skiplist。ziplist底層是用壓縮列表實現,skiplist使用zset結構作為底層實現。根據有序集合存放的值不同,物件的編碼也不同:

有序集合儲存的元素數量小於128個,並且所有元素成員長度都小於64個位元組時,有序集合物件使用ziplist編碼。不滿足以上兩個條件的採用skiplist編碼。

參考文獻

1、2、《redis設計與實現》第二版---黃健巨集

3、4、

Redis物件 Redis物件系統簡介

最新 redis記憶體 三個重要的緩衝區 最新 redis記憶體 記憶體消耗 記憶體都去哪了?最新 redis持久化 如何選擇合適的持久化方式 最新 redis持久化 aof日誌 之前幾篇文章,簡單介紹 redis用到的所有主要資料結構,簡單動態字串 sds 雙端鍊錶 字典 壓縮列表 整數集合 跳躍...

Redis物件系統

redis物件系統,包含字串物件,列表物件,雜湊物件,集合物件和有序集合物件這五種型別的物件。通過五種不同型別的物件,redis可以在執行命令之前,根據物件的型別來判斷乙個物件是否可以執行給定的命令。使用物件的另乙個好處是,我們可以針對不同的使用場景,為物件設定多種不同的資料結構實現,優化物件在不同...

Redis的物件系統

下面的內容來自 redis設計與實現 這本書。redis內部自己實現的主要資料結構有簡單動態字串 sds 雙端鍊錶 字典 跳躍表 整數集合和壓縮列表。redis並沒有直接使用這些資料結構來實現鍵值對資料庫,而是基於這些資料結構建立了乙個物件系統,這個系統包含字串物件 列表物件 雜湊物件 集合物件和有...