Redis數(shù)據(jù)結(jié)構(gòu)之listpack和quicklist使用學(xué)習(xí)
Redis兩種結(jié)構(gòu) listpack 和 quicklist
按照順序,本來應(yīng)該先介紹 quicklist 的結(jié)構(gòu),quicklist 在 7.0 之前的版本是由雙向鏈表和壓縮列表構(gòu)成的,但是在 7.0 版本已經(jīng)變成了由雙向鏈表和 listpack 實(shí)現(xiàn),所以在這里我們先介紹一下 listpack 的結(jié)構(gòu)。
1、listpack
listpack 是替換 ziplist 的數(shù)據(jù)結(jié)構(gòu),所以在結(jié)構(gòu)上兩者是有些相似的,listpack 的結(jié)構(gòu)如下:
| 總字節(jié)長(zhǎng)度 | entry個(gè)數(shù) | entry1 | entry2 | ... | entryN | end |
相比 ziplist,listpack 去除了到尾部節(jié)點(diǎn),也就是到 entryN 的偏移量,但保留了其他屬性。
對(duì)于單個(gè) entry 元素,其結(jié)構(gòu)如下:
| encoding | content | length |
encoding 表示 content 的編碼,endocing 表示實(shí)際存儲(chǔ)的內(nèi)容,length 表示該 entry 的長(zhǎng)度
避免連鎖更新
使用 listpack 替代 ziplist 的一個(gè)好處是避免了連續(xù)更新的問題。
因?yàn)?ziplist 的每個(gè)元素都有一個(gè)屬性用于保存前一個(gè)節(jié)點(diǎn)元素的長(zhǎng)度,因此前一個(gè)節(jié)點(diǎn)修改后會(huì)可能需要修改后一個(gè)節(jié)點(diǎn)的屬性,但是 listpack 沒有這個(gè)關(guān)聯(lián)關(guān)系,從而避免了影響后續(xù)元素的長(zhǎng)度,也因此避免了連鎖更新的問題。
獲取最后一個(gè)節(jié)點(diǎn)
雖然 listpack 沒有了指向尾部節(jié)點(diǎn)的偏移量,但是同樣可以快速找到 listpack 的尾部節(jié)點(diǎn),方式是通過 總字節(jié)長(zhǎng)度屬性的值,可以直接獲取到 listpack 的尾部,然后根據(jù) entry 元素尾部的 length 屬性,就可以找到尾部 entry 的起始地址了。
2、 quicklist
在 Redis 3.2 版本,列表對(duì)象的底層實(shí)現(xiàn)變成了由 quicklist 實(shí)現(xiàn),quicklist 實(shí)際上是壓縮列表和雙向鏈表的組合結(jié)構(gòu),因?yàn)?quicklist 就是一個(gè)鏈表,而鏈表中每一個(gè)元素就是壓縮列表。
而在 Redis 7.0 版本,quicklst 變成了由雙向鏈表和 listpack 構(gòu)成的結(jié)構(gòu)。
這里直接介紹 quicklist 由雙向鏈表和 listpack 構(gòu)成的結(jié)構(gòu)。
quicklist 的結(jié)構(gòu)和雙向鏈表的結(jié)構(gòu)類似:
typedef struct quicklist { quicklistNode *head; quicklistNode *tail; unsigned long count; unsigned long len; ... } quicklist;
對(duì)于一個(gè) quicklist,它也有指向 quicklist 的頭節(jié)點(diǎn)和尾節(jié)點(diǎn)的指針,如結(jié)構(gòu)中的 head 和 tail。
count 屬性統(tǒng)計(jì)每個(gè) quicklist 節(jié)點(diǎn)的 listpack 總數(shù)量的屬性
len 則是統(tǒng)計(jì) quicklist 中 quicklistNode 的數(shù)量的屬性。
typedef struct quicklistNode { struct quicklistNode *prev; struct quicklistNode *next; unsigned char *entry; size_t sz; unsigned int count : 16; ... } quicklistNode;
對(duì)于一個(gè) quicklistNode,擁有指向前置節(jié)點(diǎn)和后置節(jié)點(diǎn)的指針,還有指向其下 listpack 的 entry,以及 sz 表示該 listpack 的總字節(jié)長(zhǎng)度,count 屬性則表示該 listpack 中包含的元素個(gè)數(shù)。
以上就是Redis數(shù)據(jù)結(jié)構(gòu)之listpack和quicklist使用學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于Redis數(shù)據(jù)結(jié)構(gòu)listpack quicklist的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實(shí)現(xiàn)詳解
- Redis數(shù)據(jù)結(jié)構(gòu)之intset整數(shù)集合使用學(xué)習(xí)
- Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)
- Redis數(shù)據(jù)結(jié)構(gòu)面試高頻問題解析
- Redis數(shù)據(jù)結(jié)構(gòu)類型示例解析
- Redis數(shù)據(jù)結(jié)構(gòu)原理淺析
- redis底層數(shù)據(jù)結(jié)構(gòu)之skiplist實(shí)現(xiàn)示例
相關(guān)文章
redis實(shí)現(xiàn)簡(jiǎn)單分布式鎖
這篇文章主要介紹了redis實(shí)現(xiàn)簡(jiǎn)單分布式鎖,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2013-09-09Redis?HyperLogLog數(shù)據(jù)統(tǒng)計(jì)輕量級(jí)解決方案詳解
這篇文章主要為大家介紹了Redis?HyperLogLog數(shù)據(jù)統(tǒng)計(jì)輕量級(jí)解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟
這篇文章主要為大家介紹了Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Redis 單節(jié)點(diǎn)部署的實(shí)現(xiàn)
本文主要介紹了Redis 單節(jié)點(diǎn)部署的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Redis序列化轉(zhuǎn)換類型報(bào)錯(cuò)的解決
本文主要介紹了Redis序列化轉(zhuǎn)換類型報(bào)錯(cuò)的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Redis在Ubuntu系統(tǒng)上無法啟動(dòng)的問題排查
這篇文章主要介紹了Redis在Ubuntu系統(tǒng)上無法啟動(dòng)的問題排查,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08