Redis 數(shù)據(jù)結(jié)構(gòu)簡介

? ??????【文章僅供非商業(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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容