? ??????【文章僅供非商業(yè)用途或交流學(xué)習(xí)使用】
? ? ? ? 簡介
? ? ? ? 使用ANSI C語言編寫,遵守BSD協(xié)議。
? ? ? ? Redis用結(jié)構(gòu)化的value滿足業(yè)務(wù)的多樣性需求,常用的類型有5種:string、list、set、map、sorted-set。
? ? ? ? 一、String類型
? ? ? ? 1? 簡介
????????Redis的String類型能夠表達3種類型:字節(jié)串、整數(shù)、浮點數(shù)
? ? ? ? 三種類型之間根據(jù)具體場景由Redis完成相互間的自動轉(zhuǎn)型,并且根據(jù)需要選取底層的承載方式。
? ? ? ? 針對String類型的value還具備簡單的CAS操作,根據(jù)指定Key是否存在設(shè)置value值。
? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)
? ? ? ? 在Redis內(nèi)部,作為字節(jié)串承載的String型value內(nèi)部以int,sds(simple dynamic string)作為結(jié)構(gòu)存儲。int用來存放整形數(shù)據(jù),sds存放字節(jié) / 字符串和浮點型數(shù)據(jù)。
? ? ? ? 二、List類型
? ? ? ? 1? 簡介
? ? ? ? List即列表對象,用于存儲String隊列。
? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)
? ? ? ? List類型的value對象內(nèi)部以linkedlist或ziplist承載。當(dāng)List的元素個數(shù)和單個元素的長度較小時,Redis會采用ziplist實現(xiàn)以減少內(nèi)存占用,否則采用linkedlist結(jié)構(gòu)。
? ? ? ? 3? linkedlist實現(xiàn)
? ? ? ? linkedlist內(nèi)部實現(xiàn)是雙向鏈表
? ? ? ? 4? ziplist實現(xiàn)
? ? ? ? ziplist作為List對象承載實現(xiàn)時,通常用于List的元素個數(shù)不多且元素本身長度不大的情況。
? ? ? ? 三、Map類型
? ? ? ? 1? 簡介
????????Map型的value在Redis中又叫Hash,顧名思義,它的最初實現(xiàn)是一個哈希表。Map的語義和多數(shù)程序語言語義一致:包含若干個key-value,其中key不重復(fù)。
? ? ? ? map內(nèi)部key和value不能再嵌套map了,它只能是String所能表達的內(nèi)容:整形、浮點型、字節(jié)串。
? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)
? ? ? ? map可以用hashtable和ziplist兩種承載方式來實現(xiàn)。對于數(shù)據(jù)量較小的map,采用ziplist實現(xiàn)。
? ? ? ? 3? hashtable實現(xiàn)
? ? ? ? 4? ziplist實現(xiàn)
? ? ? ? 這里的ziplist和List的ziplist實現(xiàn)相似,都是通過entry來存放element,和List不同的是,map的ziplist的奇數(shù)位存放key,偶數(shù)位存放對應(yīng)的value,通常情況下,只有很少幾個kv對的map,采用ziplist效率反而更高,省去了hash計算、內(nèi)存尋址等操作。尤其對于長字符串key,其hash值計算本身的開銷甚至遠大于順序遍歷時字符串比較的開銷。
? ? ? ? 四、Set類型
? ? ? ? 1? 簡介
????????Set類似List,但它是一個無序集合,其中的元素不重復(fù)。
? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)
? ? ? ? Set在Redis中以insert或hashtable來存儲。后者前述章節(jié)已介紹,對于Set,hashtable中的vlaue永遠為NULL。當(dāng)Set中只包含整數(shù)型的元素時,采用intset作為實現(xiàn)。
? ? ? ? 3? intset
? ? ? ? intset的核心元素是一個字節(jié)數(shù)組,其中從小到大有序地存放著set的元素,intset同樣針對小證書進行了性能優(yōu)化,對不同類型的整數(shù)采用變長的存儲,在元素均不大的情況下減少了內(nèi)存開銷。
? ? ? ? 五、Serted-Set類型
? ? ? ? 1? 簡介
? ? ? ? Sorted-Set是Redis特有的數(shù)據(jù)類型,類似Map是一個key-value對,但它是一個有序的key-value對:
? ? ? ? key:key-value對中的鍵,在一個sorted-set中不重復(fù)。
? ? ? ? value:是一個浮點數(shù),成為score。
? ? ? ? 有序:sorted-set內(nèi)部按照score從小到大排序。
? ? ? ? 2? 內(nèi)存數(shù)據(jù)結(jié)構(gòu)
? ? ? ? Sorted-Set類型的value對象內(nèi)部以ziplist或skiplist+hashtable來實現(xiàn)。
? ? ? ? ziplist適用于元素個數(shù)不多、元素內(nèi)容不大的場景。
? ? ? ? 對于更通用的場景,sorted-set采用skiplist(跳表)來實現(xiàn)。
? ? ? ? 3? skiplist
? ? ? ? 關(guān)于skiplist介紹:http://m.itdecent.cn/writer#/notebooks/36290124/notes/45470984
? ? ? ? 4? hashtable
? ? ? ? 跳表是一種實現(xiàn)順序相關(guān)操作的較高效的數(shù)據(jù)結(jié)構(gòu),但它對于簡單的ZSCORE操作效率并不高,Redis在實現(xiàn)sorted-set時,同時使用hashtable和skiplist。