簡介
從資料型別上體現就是,同一個資料型別,在不同的情況下會使用不同的編碼型別,底層所使用的的資料結構也不相同,

字串物件
字串物件的編碼可以是 int、raw 和 embstr 三者之一,
embstr 編碼是專門用于保存簡短字串的一種優化編碼方式,與 raw 編碼會呼叫兩次記憶體分配函式分別創建 redisObject 結構和 sdshdr 結構不同,embstr 只會使用一次記憶體分配函式創建一塊連續的記憶體空間同時存放 redisObject 結構和 sdshdr 結構,
字串轉換編碼的條件如下:
- 如果字串物件存盤的是整數值并且不超過
long的范圍時,優先選擇使用int作為編碼方式 - 如果存盤的字串長度大于 32 個位元組,會使用
raw編碼的簡單動態字串作為保存 - 如果存盤的字串長度小于 32 個位元組,會使用
embstr編碼的簡單動態字串作為保存
字串物件中有兩個需要注意的地方:
- 對于存盤浮點數的字串物件,實際上這個浮點數是以字串值來保存的,執行如
INCRBYFLOAT這樣的命令時,Redis 會先將字串轉換成浮點數計算,然后再轉換成字串值存盤 int編碼和embstr編碼在條件滿足下會轉換成raw編碼,embstr在執行修改命令之后總是會轉換成raw編碼,這個程序是不可逆的
串列物件
在 3.2 版本之前,串列物件的編碼可以是 ziplist 或者 zlinkedlist 的其中一個;在 3.2 版本之后,串列物件的編碼只能是 quicklist,
哈希物件
哈希物件的編碼可以是 ziplist 或者 hashtable 中的一個,
哈希物件使用 ziplist 作為底層實作的時候,每當有新的鍵值對要插入哈希物件時,Redis 會先保存鍵的壓縮串列節點到壓縮串列的表尾,然后再保存值的壓縮串列節點到壓縮串列的表尾,
當哈希物件同時滿足以下兩個條件時,哈希物件使用 ziplist 編碼:
- 哈希物件保存的所有鍵值對的鍵和值的字串長度都小于 64 位元組
- 哈希物件保存的鍵值對數量小于 512 個
集合物件
集合物件的編碼可以是 intset 或者 hashtable 中的一個,
hashtable 編碼的集合物件使用字典作為底層實作,字典的每個鍵都是字串物件,這個字串物件包含著集合元素,字典的每個值都直接存盤 NULL,
當集合物件同時滿足以下兩個條件時,集合物件使用 intset 編碼:
- 集合物件保存的所有元素都是整數值
- 集合物件保存的元素資料不超過 512 個
有序集合物件
有序集合物件的編碼可以是 ziplist 或者 skiplist 中的一個,
有序集合物件使用 ziplist 編碼作為底層實作時,每個集合物件會使用兩個緊挨在一起的壓縮串列節點來保存,第一個節點保存元素的成員,第二個元素則保存元素的分值,
這里有一點需要注意,skiplist 編碼的有序集合使用 zset 結構作為底層實作,一個 zset 結構包含一個字典和一個跳表,其中字典的鍵保存元素的成員,字典的值保存元素的分值;跳表的 object 屬性保存元素的成員,跳表的 score 屬性保存元素的分值,
理論上有序集合可以只使用字典或者跳表實作,但是使用兩個結構冗余存盤有序集合物件的成員和分值,既保留了字典 \(O(1)\) 時間復雜度查找的效率,也保留了跳表范圍型操作的所有優點,
當同時滿足以下兩個條件時,有序集合會使用 ziplist 編碼:
- 有序集合保存的元素數量小于 128 個
- 有序集合保存的所有元素成員的長度都小于 64 位元組
首發于「程式員翔仔」,點擊查看更多,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/550755.html
標籤:其他
下一篇:返回列表
