緊湊列表
在
Redis5.0
又引入了新的數據結構listpack
,是在壓縮列表基礎上的改進,整體有所類似,緊湊列表解決了一個很重要的問題:級聯更新;Redis深度歷險-壓縮列表 - 簡書 (jianshu.com)
級聯更新
在緊湊列表中的prevlen
有1字節長和5字節長兩種情況,在插入紅色元素時也有兩種情況:
- 紅色節點元素小於254字節,只需要更新黃色節點的
prevlen
即可 - 紅色節點元素大於254字節,黃色節點需要擴容
prevlen
並更新數據
在上述第2種情況發生時,也有兩種情況:
- 黃色元素擴容後依舊小於254字節,只需要更新綠色節點的
prevlen
即可 - 黃色元素擴容後大於254字節,綠色元素則也需要擴容
prevlen
了
如果有多個接近於254字節的元素,就會造成級聯更新了
緊湊列表的內存排布
-
total_bytes
:總長度 -
size
:元素個數 -
entry
:元素-
encoding
:編碼方式,同樣支持很多種 -
content
:內容 -
length
:本元素長度
-
緊湊列表每個元素尾部存儲了當前元素的長度,元素長度結合total_bytes
就可以實現從後往前的遍歷,不同元素的內容解耦開了,不再會發生級聯更新的問題了