Redis讀書筆記

Redis共有字符串,列表,哈希,集合,有序集合五種類型的對(duì)象,每種類型的對(duì)象至少都有兩種或以上的編碼方式,不同的編碼可以在不同的使用場(chǎng)景上優(yōu)化對(duì)象的使用效率。


Redis數(shù)據(jù)結(jié)構(gòu)與對(duì)象如上圖所示

1.?簡(jiǎn)單動(dòng)態(tài)字符串(Simple Dynamic String)

Redis只會(huì)使用C字符串作為字面量,在大多數(shù)情況下,Redis使用簡(jiǎn)單動(dòng)態(tài)字符串作為字符串表示。

2.鏈表

(可實(shí)現(xiàn)的功能:鏈表鍵,發(fā)布與訂閱,慢查詢,監(jiān)視器等)

每個(gè)鏈表節(jié)點(diǎn)由一個(gè)listnode結(jié)構(gòu)來表示。每個(gè)節(jié)點(diǎn)都有一個(gè)指向前置節(jié)點(diǎn)和后置節(jié)點(diǎn)的指針,所以Redis的鏈表是雙端節(jié)點(diǎn)。

每個(gè)鏈表使用一個(gè)list結(jié)構(gòu)來表示,這個(gè)結(jié)構(gòu)帶有表頭節(jié)點(diǎn)指針、表尾節(jié)點(diǎn)指針,以及鏈表長(zhǎng)度等信息。

因?yàn)殒湵肀眍^節(jié)點(diǎn)的前置節(jié)點(diǎn)和表尾節(jié)點(diǎn)的后置節(jié)點(diǎn)都指向NULL,所以Redis的鏈表實(shí)現(xiàn)的是無環(huán)鏈表。

通過為鏈表設(shè)置不同的類型特定函數(shù),Redis的鏈表可以用于保存各種不同類型的值。

3.字典

(可實(shí)現(xiàn)的功能:數(shù)據(jù)庫,哈希鍵)

Redis的字典使用哈希表作為底層實(shí)現(xiàn),每個(gè)字典帶有兩個(gè)哈希表,一個(gè)平時(shí)使用,另一個(gè)僅在進(jìn)行rehash時(shí)使用。

當(dāng)字典被用作數(shù)據(jù)庫的底層實(shí)現(xiàn),或者哈希鍵的底層實(shí)現(xiàn)時(shí),Redis使用MurmurHash2算法來計(jì)算鍵的哈希值。

哈希表使用鏈地址法來解決鍵沖突,被分配到同一個(gè)索引的多個(gè)鍵值對(duì)會(huì)連接成一個(gè)單向鏈表。

在對(duì)哈希表進(jìn)行擴(kuò)展或者收縮操作時(shí),程序需要將現(xiàn)有哈希表包含的所有鍵值對(duì)rehash到新哈希表中,并且這個(gè)rehash過程并不是一次性完成的,而是漸進(jìn)式完成的。

4.跳躍表

跳躍表是有序集合的底層實(shí)現(xiàn)之一。

Redis的跳躍表實(shí)現(xiàn)由zskiplist和zskiplistNode兩個(gè)結(jié)構(gòu)組成,其中zskiplist用于保存跳躍表信息(比如表頭節(jié)點(diǎn),表尾節(jié)點(diǎn),長(zhǎng)度),而zskiplistNode則用于表示跳躍表節(jié)點(diǎn)。

每個(gè)跳躍表節(jié)點(diǎn)的層高都是1~32之間的隨機(jī)數(shù)。

在同一個(gè)跳躍表中,多個(gè)節(jié)點(diǎn)可以包含相同的分值,但每個(gè)節(jié)點(diǎn)的成員對(duì)象必須是唯一的。

跳躍表中的節(jié)點(diǎn)按照分值大小進(jìn)行排序,當(dāng)分值相同時(shí),節(jié)點(diǎn)按照成員對(duì)象的大小進(jìn)行排序。

5.整數(shù)集合

整數(shù)集合是集合鍵的底層實(shí)現(xiàn)之一。

整數(shù)集合的底層實(shí)現(xiàn)為數(shù)組,這個(gè)數(shù)組以有序,無重復(fù)的方式保存集合元素,在有需要時(shí),程序會(huì)根據(jù)新添加元素的的類型,改變這個(gè)數(shù)組的類型。

升級(jí)操作作為整數(shù)集合帶來了操作上的靈活性,并且盡可能地節(jié)約內(nèi)存。

整數(shù)集合只支持升級(jí)操作,不支持降級(jí)操作。

6.壓縮列表

壓縮列表是一種為節(jié)約內(nèi)存而開發(fā)的順序型數(shù)據(jù)結(jié)構(gòu)。

壓縮列表被用作列表建和哈希鍵的底層實(shí)現(xiàn)之一。

壓縮列表可以包含多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者整數(shù)值。

添加新節(jié)點(diǎn)到壓縮列表,或者從壓縮列表中刪除節(jié)點(diǎn),可能會(huì)引發(fā)連鎖更新操作,但這種操作出現(xiàn)的幾率并不高。

7.對(duì)象

Redis數(shù)據(jù)庫中的每個(gè)鍵值對(duì)的鍵和值都是一個(gè)對(duì)象。

服務(wù)器在執(zhí)行某些命令之前,會(huì)先檢查給定鍵的類型能否執(zhí)行指定的命令,而檢查一個(gè)鍵的類型就是檢查鍵的值對(duì)象的類型。

Redis的對(duì)象系統(tǒng)帶有引用計(jì)數(shù)實(shí)現(xiàn)的內(nèi)存回收機(jī)制,當(dāng)一個(gè)對(duì)象不再被使用時(shí),該對(duì)象所占用的內(nèi)存就匯報(bào)自動(dòng)釋放。對(duì)象的計(jì)數(shù)屬性還帶有對(duì)象共享功能。

Redis會(huì)共享值為0~9999的字符串對(duì)象。

對(duì)象會(huì)記錄自己最后一次被訪問的時(shí)間(lru),這個(gè)時(shí)間可以用于計(jì)算對(duì)象的空轉(zhuǎn)時(shí)間。

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

相關(guān)閱讀更多精彩內(nèi)容

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