redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實(shí)現(xiàn)詳解
ziplist實(shí)現(xiàn)
注意:我使用的版本是6.0.10,不同版本可能略有差別
ziplist又叫做壓縮列表,使用一段連續(xù)的內(nèi)存來存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),redis為了節(jié)約內(nèi)存而開發(fā)的,可以節(jié)省內(nèi)存空間,其并不是以某種壓縮算法來進(jìn)行壓縮存儲(chǔ)數(shù)據(jù),而是表示一組連續(xù)的內(nèi)存空間使用
ziplist結(jié)構(gòu)
<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>
- zlbytes 32位,4個(gè)字節(jié) ziplist總字節(jié)數(shù)
- zltail 32位,4個(gè)字節(jié) 壓縮列表表尾距離起始位置有多少字節(jié),通過該偏移量,無需遍歷整個(gè)列表就可以確定表尾節(jié)點(diǎn)的地址
- zllen 16位,2個(gè)字節(jié) 記錄壓縮列表節(jié)點(diǎn)數(shù)量,由于是16位,最大值為65535,超過的話需要遍歷整個(gè)ziplist才可以知道
- entry 存儲(chǔ)的各個(gè)節(jié)點(diǎn)
- zlend 8位,1個(gè)字節(jié) 表示ziplist結(jié)尾的特殊值
entry的結(jié)構(gòu)
<prevlen> <encoding> <entry-data>
- prevlen 上一個(gè)節(jié)點(diǎn)的長度,可以和當(dāng)前的地址進(jìn)行指針運(yùn)算,找到上一個(gè)節(jié)點(diǎn)的起始地址
- encoding 內(nèi)容的編碼及長度
- entry-data 字符串類型的值
由于這個(gè)特殊的結(jié)構(gòu)構(gòu)造,所以壓縮列表可以很快的從表尾向表頭遍歷操作
- 根據(jù)zltail可以直接獲取到表尾節(jié)點(diǎn)
- 指針指向表尾節(jié)點(diǎn)起始地址的指針,根據(jù)prevlen可以直接獲取到前一個(gè)節(jié)點(diǎn)的起始地址的指針
- 一直向前一個(gè)節(jié)點(diǎn)遍歷,一直到頭節(jié)點(diǎn)
使用ziplist的數(shù)據(jù)類型
redis中hash、list、zset使用了ziplist結(jié)構(gòu)存儲(chǔ),但是存在了一些條件
hash-max-ziplist-entries 512 hash-max-ziplist-value 64 # -5: max size: 64 Kb <-- not recommended for normal workloads # -4: max size: 32 Kb <-- not recommended # -3: max size: 16 Kb <-- probably not recommended # -2: max size: 8 Kb <-- good # -1: max size: 4 Kb <-- good list-max-ziplist-size -2 zset-max-ziplist-entries 128 zset-max-ziplist-value 64
ziplist會(huì)比hash、list、zset中使用的底層結(jié)構(gòu)節(jié)省內(nèi)存,存儲(chǔ)越小的數(shù)據(jù),使用ziplist來進(jìn)行數(shù)據(jù)壓縮可以得到更好的壓縮率,但是會(huì)造成額外的內(nèi)存碎片率
以上就是redis底層數(shù)據(jù)結(jié)構(gòu)之ziplist實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于redis底層數(shù)據(jù)結(jié)構(gòu)ziplist的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis?中使用?list,streams,pub/sub?幾種方式實(shí)現(xiàn)消息隊(duì)列的問題
這篇文章主要介紹了Redis?中使用?list,streams,pub/sub?幾種方式實(shí)現(xiàn)消息隊(duì)列,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03redis 數(shù)據(jù)刪除策略和逐出算法的問題小結(jié)
這篇文章主要介紹了redis 數(shù)據(jù)刪除策略和逐出算法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06通過 Redis 實(shí)現(xiàn) RPC 遠(yuǎn)程方法調(diào)用(支持多種編程語言)
這篇文章主要介紹了通過 Redis 實(shí)現(xiàn) RPC 遠(yuǎn)程方法調(diào)用,支持多種編程語言,本文就以Ruby和Python為例,給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-09-09Redis集群服務(wù)器的實(shí)現(xiàn)(圖文步驟)
本文介紹了Redis集群服務(wù)器的優(yōu)勢,為讀者提供了全面的Redis集群服務(wù)器知識(shí)和使用技巧,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09詳解Redis中key的命名規(guī)范和值的命名規(guī)范
這篇文章主要介紹了詳解Redis中key的命名規(guī)范和值的命名規(guī)范,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12redis配置standAlone版的jedisPool示例
這篇文章主要為大家介紹了redis配置standAlone版的jedisPool示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07基于Redis實(shí)現(xiàn)延時(shí)隊(duì)列的優(yōu)化方案小結(jié)
本文主要介紹了基于Redis實(shí)現(xiàn)延時(shí)隊(duì)列的優(yōu)化方案小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07