redis的數據結構及數據類型

string(字符串),字符串是最基本類型,所有的鍵都是字符串類型,字符串之外的其他幾種複雜類型的元素也是字符串。字符串長度不能超過512M。字符串內部有3種編碼:

int:8個字節的長整型

embstr:<=39字節的字符串。embstr與raw都使用RedisObject和SDS保存數據。區別在於:embstr的使用只分配一次內存空間(因此RedisObject和SDS是連續的),而raw需要分配兩次內存空間(分別為RedisObject和SDS分配空間)。因此與raw相比,embstr的好處在於創建時少分配一次空間、刪除時少釋放一次空間、對象的所有數據連在一起,尋找方便。而embstr的壞處也很明顯:如果字符串的長度增加需要重新分配內存時,整個RedisObject和SDS都需要重新分配空間,因此Redis中的embstr實現為只讀。

raw:大於39個字節的字符串

embstr和raw進行區分的長度是39是因為RedisObject的長度是16字節,SDS的長度是9+字符串長度.因此當字符串長度是39時,embstr的長度正好是16+9+39=64,jemalloc正好可以分配64字節的內存單元。

當int數據不再是整數,或大小超過了long的範圍時,自動轉化為raw。

而對於embstr,由於其實現是隻讀的,因此在對embstr對象進行修改時,都會先轉化為raw再進行修改,因此,只要是修改embstr對象,修改後的對象一定是raw的,無論是否達到了39個字節

list(列表),用來存儲多個有序的字符串,每個字符串稱為元素;一個列表可以存儲2^32-1個元素。Redis中的列表支持兩端插入和彈出,並可以獲得指定位置(或範圍)的元素,可以充當數組、隊列、棧等。列表的內部編碼可以是壓縮列表(ziplist)或雙端鏈表(linkedlist)

雙端鏈表:由一個list結構和多個listNode結構組成

壓縮列表:壓縮列表是Redis為了節約內存而開發的,是由一系列特殊編碼的連續內存塊(而不是像雙端鏈表一樣每個節點是指針)組成的順序型數據結構

只有同時滿足下面兩個條件時,才會使用壓縮列表:

列表中元素數量小於512個;

列表中所有字符串對象都不足64字節。

set(集合),集合(set)與列表類似,都是用來保存多個字符串,但集合與列表有兩點不同:集合中的元素是無序的,因此不能通過索引來操作元素;集合中的元素不能有重複

一個集合中最多可以存儲2^32-1個元素,除了支持常規的增刪改查,Redis還支持多個集合取交集、並集、差集。

集合的內部編碼可以是整數集合(intset)或哈希表(hashtable)。

只有同時滿足下面兩個條件時,集合才會使用整數集合:

集合中元素數量小於512個;

集合中所有元素都是整數值。

zset(有序集合),有序集合與集合一樣,元素都不能重複。但與集合不同的是,有序集合中的元素是有順序的。與列表使用索引下標作為排序依據不同,有序集合為每個元素設置一個分數(score)作為排序依據

有序集合的內部編碼可以是壓縮列表(ziplist)或跳躍表(skiplist)

只有同時滿足下面兩個條件時,才會使用壓縮列表:

有序集合中元素數量小於128個;

有序集合中所有成員長度都不足64字節。

hash(哈希),哈希使用的內部編碼可以是壓縮列表(ziplist)和哈希表(hashtable)兩種

hashtable:一個hashtable由1個dict結構、2個dictht結構、1個dictEntry指針數組(稱為bucket)和多個dictEntry結構組成。

redis的數據結構及數據類型

Redis中的哈希之所以在dictht和dictEntry結構之外還有一個dict結構,一方面是為了適應不同類型的鍵值對,另一方面是為了rehash。

只有同時滿足下面兩個條件時,才會使用壓縮列表:

哈希中元素數量小於512個;

哈希中所有鍵值對的鍵和值字符串長度都小於64字節。


分享到:


相關文章: