? ??????【文章僅供非商業(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://www.reibang.com/writer#/notebooks/36290124/notes/45470984
? ? ? ? 4? hashtable
? ? ? ? 跳表是一種實現(xiàn)順序相關(guān)操作的較高效的數(shù)據(jù)結(jié)構(gòu),但它對于簡單的ZSCORE操作效率并不高崔涂,Redis在實現(xiàn)sorted-set時阳掐,同時使用hashtable和skiplist。