數據類型 | 實現方式 | 描述 |
---|---|---|
String | int | 用來保存整數值 |
raw | 用來保存長字符串(長度大於44字節) | |
embstr | 保存短字符串(長度小於44字節) | |
List | ziplist(壓縮列表) |
列表保存元素個數小於512個 每個元素長度小於64字節 壓縮列表是Redis爲了節省內存而開發的,是由一系列特殊編碼的連續內存塊組成的順序型數據結構,相對於字典數據結構,壓縮列表用於元素個數少、元素長度小的場景 |
linkedlist(雙端鏈表) | 當無法使用ziplist列表時則使用linkedlist | |
Hash |
ziplist(壓縮列表)
|
1、列表保存元素個數小於512個 2、每個元素長度小於64字節 |
hashtable |
hashtable 編碼的哈希表對象底層使用字典數據結構,哈希對象中的每個鍵值對都使用一個字典鍵值對。
|
|
SET | intset | intset 編碼的集合對象使用整數集合作爲底層實現,集合對象包含的所有元素都被保存在整數集合中 |
hashtable | hashtable 編碼的集合對象使用 字典作爲底層實現,字典的每個鍵都是一個字符串對象,這裏的每個字符串對象就是一個集合中的元素,而字典的值則全部設置爲 null。這裏可以類比Java集合中HashSet 集合的實現,HashSet 集合是由 HashMap 來實現的,集合中的元素就是 HashMap 的key,而 HashMap 的值都設爲 null。 | |
ZSET | ziplist | ziplist 編碼的有序集合對象使用壓縮列表作爲底層實現,每個集合元素使用兩個緊挨在一起的壓縮列表節點來保存,第一個節點保存元素的成員,第二個節點保存元素的分值。並且壓縮列表內的集合元素按分值從小到大的順序進行排列,小的放置在靠近表頭的位置,大的放置在靠近表尾的位置。 |
skiplist |
skiplist 編碼的有序集合對象使用 zet 結構作爲底層實現,一個 zset 結構同時包含一個字典和一個跳躍表
字典的鍵保存元素的值,字典的值則保存元素的分值;跳躍表節點的 object 屬性保存元素的成員,跳躍表節點的 score 屬性保存元素的分值。
這兩種數據結構會通過指針來共享相同元素的成員和分值,所以不會產生重複成員和分值,造成內存的浪費。
說明:其實有序集合單獨使用字典或跳躍表其中一種數據結構都可以實現,但是這裏使用兩種數據結構組合起來,原因是假如我們單獨使用 字典,雖然能以 O(1) 的時間複雜度查找成員的分值,但是因爲字典是以無序的方式來保存集合元素,所以每次進行範圍操作的時候都要進行排序;假如我們單獨使用跳躍表來實現,雖然能執行範圍操作,但是查找操作有 O(1)的複雜度變爲了O(logN)。因此Redis使用了兩種數據結構來共同實現有序集合。 |