前面我們看了redis用到的主要資料結構,如簡單動態字串(sds)、雙向鍊錶、字典、壓縮列表、整數集合等。
但是redis並沒有直接使用這些資料結構來實現鍵值對,而是基於這些資料結構建立了乙個物件系統,這個系統包括字串物件、列表物件、雜湊物件、集合物件、有序集合物件,除此之外,redis的物件系統還實現了基於計數技術的記憶體**機制,另外redis還通過引用計數技術實現了物件共享機制(適當條件下,多個資料庫鍵共享同乙個物件來節約記憶體)。
最後,redis的物件帶有訪問時間記錄資訊,該資訊可以用於計算資料庫鍵的空轉時長,在伺服器啟用了maxmemory功能的情況下,空轉時長較大的鍵會優先被伺服器刪除。
1、redis中的每個結構都是由redisobject結構標識,包含ptr(指向底層實現的資料結構)、encoding(決定用那種底層資料結構)、type等屬性。
2、當我們建立乙個鍵值對時,我們至少會建立兩個物件:鍵物件(字串物件),值物件(物種型別)。
3、字串物件的編碼可以是整數、raw或者enbstr、sds
enbstr(短字串長度小於32)呼叫一次分配記憶體函式,分配乙個連續的記憶體包含redisobject結構與sdshdr結構,不包含修改命令,執行任何修改命令會轉為raw物件。
sds(字串長度超過32)。
raw 會呼叫兩次記憶體分配分別建立redisobject結構與sdshdr結構。
4、列表物件,列表物件的編碼可以是ziplist或者linkedlist
ziplist使用壓縮列表作為底層實現。列表物件儲存的所有字串元素長度都小於64位元組,元素數量小於512個時使用壓縮列表做為底層實現。
linkedlist編碼列表物件使用雙向鍊錶作為底層實現,每個雙向鍊錶節點都儲存乙個字串物件。
5、雜湊物件
雜湊物件的編碼可以是ziplist或者hashtable
ziplist編碼的雜湊物件使用壓縮表作為底層實現,當由新的鍵值對加入到hash物件時,程式會先將儲存了鍵的壓縮列表節點推入到壓縮列表的表尾,然後將儲存了值的壓縮列表節點推入到壓縮列表的表尾。
使用hashtable作為編碼的雜湊物件使用字典作為底層實現,鍵使用字串物件,值使用字串物件。
6、集合物件
集合物件的編碼可以是 intset或者是hashtable
intset編碼的集合物件使用整數集合作為底層實現。
hashtable編碼的集合物件使用字典作為底層實現,字典的每個鍵都是乙個字串物件,每個字串物件包含乙個集合元素,而字段的值則全部設定為null。
物件轉換 。intset轉hashtable條件:元素中不全是整數或者元素數量超過512.
7、有序集合物件
有序集合的編碼可以是ziplist 或者skiplist
ziplist編碼的壓縮列表物件使用壓縮列表作為底層實現,每個集合元素使用兩個挨在一起的壓縮列表節點來儲存,第乙個節點儲存元素的成員(member)第二個元素則儲存元素的分值(score)。
skiplist編碼的有序集合物件使用zset結構作為底層實現,乙個zset結構同時包含乙個字典和乙個跳躍表。
typedef struct解釋下為什麼同時使用字典與跳躍表來實現有序集合:雖然用兩種結構的任意一種都能實現有序集合,但是當我們只是用字典來實現有序集合時,由於字典是乙個無序的儲存元素,當我們實行範圍操作時,需要先對所有的元素進行排序,這裡所使用的時間複雜度至少為o(nlogn),並且有額外的記憶體消費;另外如果只使用跳躍表來實現有序集合時,雖然範圍操作的優勢被保留,但是沒有了字典根據成員查詢分值時這一操作的複雜度將從o(1)提公升到o(logn)。zset
編碼轉換,當元素的數量小於128,且每個元素的長度都小於64位元組時,使用ziplist。
8、記憶體**
每個物件的引用技術資訊由redisobject結構的refcount屬性記錄。
建立物件時,計數值會被預設初始化為1,被程式使用時,計數器加一,不再被使用時,計數器減一,當計數器為0時,物件占用的記憶體會被釋放。
9、物件空轉時長
物件空轉時長使用redisobjet結構中的lru屬性記錄,該屬性記錄物件最後一次被訪問的時間。
--------- end --------
每天學一點,總會有收穫。
Redis學習筆記(六) 物件系統
2.redis中的五種物件型別 2.2 列表物件 2.3 雜湊物件 2.4 集合物件 2.5 有序集合物件 3.記憶體 機制 4.物件共享機制 5.物件的空轉時長 總結參考資料 redis沒有直接使用基礎資料結構來實現資料庫,而是基於這些資料結構建立了乙個物件系統。這個系統包含字串物件 列表物件 雜...
Redis筆記2 物件
redis中總共有五種型別的物件,分別是 字串物件 雙端鍊錶 字典 壓縮列表 整數集合。上述的五種型別的物件均具有相同的結構 typedef struct redisobject 物件的型別總共為五種,如下 可以通過 type 命令驗證 redis物件的型別 編碼決定了redis物件儲存過程中所採用...
PDF學習六 物件
說明 pdf支援8種基本型別物件。布林物件 數字物件 串物件 名稱物件 陣列物件 字典物件 流物件 空物件,以及間接物件。pdf reference1.7.pdf 3.2 objects 熟練掌握pdf8種基本型別物件。true false 整數物件 integer 以零為中心表示乙個特定間隔內的整...