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 實現(xiàn),所以在這里我們先介紹一下 listpack 的結(jié)構(gòu)。
1、listpack
listpack 是替換 ziplist 的數(shù)據(jù)結(jié)構(gòu),所以在結(jié)構(gòu)上兩者是有些相似的,listpack 的結(jié)構(gòu)如下:
| 總字節(jié)長度 | entry個數(shù) | entry1 | entry2 | ... | entryN | end |
相比 ziplist,listpack 去除了到尾部節(jié)點,也就是到 entryN 的偏移量,但保留了其他屬性。
對于單個 entry 元素,其結(jié)構(gòu)如下:
| encoding | content | length |
encoding 表示 content 的編碼,endocing 表示實際存儲的內(nèi)容,length 表示該 entry 的長度
避免連鎖更新
使用 listpack 替代 ziplist 的一個好處是避免了連續(xù)更新的問題。
因為 ziplist 的每個元素都有一個屬性用于保存前一個節(jié)點元素的長度,因此前一個節(jié)點修改后會可能需要修改后一個節(jié)點的屬性,但是 listpack 沒有這個關(guān)聯(lián)關(guān)系,從而避免了影響后續(xù)元素的長度,也因此避免了連鎖更新的問題。
獲取最后一個節(jié)點
雖然 listpack 沒有了指向尾部節(jié)點的偏移量,但是同樣可以快速找到 listpack 的尾部節(jié)點,方式是通過 總字節(jié)長度屬性的值,可以直接獲取到 listpack 的尾部,然后根據(jù) entry 元素尾部的 length 屬性,就可以找到尾部 entry 的起始地址了。
2、 quicklist
在 Redis 3.2 版本,列表對象的底層實現(xiàn)變成了由 quicklist 實現(xiàn),quicklist 實際上是壓縮列表和雙向鏈表的組合結(jié)構(gòu),因為 quicklist 就是一個鏈表,而鏈表中每一個元素就是壓縮列表。
而在 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;對于一個 quicklist,它也有指向 quicklist 的頭節(jié)點和尾節(jié)點的指針,如結(jié)構(gòu)中的 head 和 tail。
count 屬性統(tǒng)計每個 quicklist 節(jié)點的 listpack 總數(shù)量的屬性
len 則是統(tǒng)計 quicklist 中 quicklistNode 的數(shù)量的屬性。
typedef struct quicklistNode {
struct quicklistNode *prev;
struct quicklistNode *next;
unsigned char *entry;
size_t sz;
unsigned int count : 16;
...
} quicklistNode;對于一個 quicklistNode,擁有指向前置節(jié)點和后置節(jié)點的指針,還有指向其下 listpack 的 entry,以及 sz 表示該 listpack 的總字節(jié)長度,count 屬性則表示該 listpack 中包含的元素個數(shù)。
以上就是Redis數(shù)據(jù)結(jié)構(gòu)之listpack和quicklist使用學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于Redis數(shù)據(jù)結(jié)構(gòu)listpack quicklist的資料請關(guān)注腳本之家其它相關(guān)文章!
- redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實現(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實現(xiàn)示例
相關(guān)文章
Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題
在網(wǎng)站開發(fā)中,我們經(jīng)常會遇到需要控制用戶重復(fù)刷新頁面的情況,本文就來介紹了Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題,感興趣的可以了解一下2024-03-03
Redis Template實現(xiàn)分布式鎖的實例代碼
使用Redis的SETNX命令獲取分布式鎖的步驟,接下來通過本文給大家介紹Redis Template實現(xiàn)分布式鎖的實例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2018-09-09
基于redis 7.2.3的makefile源碼解讀學(xué)習(xí)
這篇文章主要為大家介紹了基于redis 7.2.3的makefile源碼解讀學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
springboot項目redis緩存異常實戰(zhàn)案例詳解(提供解決方案)
redis基本上是高并發(fā)場景上會用到的一個高性能的key-value數(shù)據(jù)庫,屬于nosql類型,一般用作于緩存,一般是結(jié)合數(shù)據(jù)庫一塊使用的,但是在使用的過程中可能會出現(xiàn)異常的問題,這篇文章主要介紹了springboot項目redis緩存異常實戰(zhàn)案例詳解(提供解決方案),需要的朋友可以參考下2025-05-05
Redis中的String類型及使用Redis解決訂單秒殺超賣問題
這篇文章主要介紹了Redis中的String類型及使用Redis解決訂單秒殺超賣問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

