redis底層數(shù)據(jù)結構之ziplist實現(xiàn)詳解
ziplist實現(xiàn)
注意:我使用的版本是6.0.10,不同版本可能略有差別
ziplist又叫做壓縮列表,使用一段連續(xù)的內存來存儲數(shù)據(jù)的數(shù)據(jù)結構,redis為了節(jié)約內存而開發(fā)的,可以節(jié)省內存空間,其并不是以某種壓縮算法來進行壓縮存儲數(shù)據(jù),而是表示一組連續(xù)的內存空間使用
ziplist結構
<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>
- zlbytes 32位,4個字節(jié) ziplist總字節(jié)數(shù)
- zltail 32位,4個字節(jié) 壓縮列表表尾距離起始位置有多少字節(jié),通過該偏移量,無需遍歷整個列表就可以確定表尾節(jié)點的地址
- zllen 16位,2個字節(jié) 記錄壓縮列表節(jié)點數(shù)量,由于是16位,最大值為65535,超過的話需要遍歷整個ziplist才可以知道
- entry 存儲的各個節(jié)點
- zlend 8位,1個字節(jié) 表示ziplist結尾的特殊值
entry的結構
<prevlen> <encoding> <entry-data>
- prevlen 上一個節(jié)點的長度,可以和當前的地址進行指針運算,找到上一個節(jié)點的起始地址
- encoding 內容的編碼及長度
- entry-data 字符串類型的值
由于這個特殊的結構構造,所以壓縮列表可以很快的從表尾向表頭遍歷操作
- 根據(jù)zltail可以直接獲取到表尾節(jié)點
- 指針指向表尾節(jié)點起始地址的指針,根據(jù)prevlen可以直接獲取到前一個節(jié)點的起始地址的指針
- 一直向前一個節(jié)點遍歷,一直到頭節(jié)點
使用ziplist的數(shù)據(jù)類型
redis中hash、list、zset使用了ziplist結構存儲,但是存在了一些條件
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會比hash、list、zset中使用的底層結構節(jié)省內存,存儲越小的數(shù)據(jù),使用ziplist來進行數(shù)據(jù)壓縮可以得到更好的壓縮率,但是會造成額外的內存碎片率
以上就是redis底層數(shù)據(jù)結構之ziplist實現(xiàn)詳解的詳細內容,更多關于redis底層數(shù)據(jù)結構ziplist的資料請關注腳本之家其它相關文章!
相關文章
使用Redis實現(xiàn)數(shù)據(jù)庫對象自增ID的方法
在分布式項目中,數(shù)據(jù)表的主鍵ID一般可能存在于UUID或自增ID這兩種形式,UUID好理解而且實現(xiàn)起來也最容易,但是缺點就是數(shù)據(jù)表中的主鍵ID是32位的字符串,我們通常會優(yōu)先考慮使用自增ID來代替UUID使用,所以本文介紹了使用Redis實現(xiàn)生成對象自增ID的方法2024-11-11
?Redis?實現(xiàn)計數(shù)器和限速器的示例代碼
本文主要介紹了?Redis?實現(xiàn)計數(shù)器和限速器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-02-02

