Redis之压缩链表ziplist
生活随笔
收集整理的這篇文章主要介紹了
Redis之压缩链表ziplist
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ziplist
- 什么是ziplist?
- ziplist結(jié)構(gòu)
- entry節(jié)點的結(jié)構(gòu)
- 添加或者刪除引起的連鎖更新
什么是ziplist?
顧名思義ziplist就是壓縮鏈表, 壓縮鏈表就是為節(jié)省內(nèi)存而生的
因為Redis是基于內(nèi)存的數(shù)據(jù)庫, 所以讀取或者寫入的速度很快, 但由于內(nèi)存資源有限, 所以我們要盡可能的節(jié)約內(nèi)存, 于是Redis官方就創(chuàng)建出了ziplist這一節(jié)省內(nèi)存的結(jié)構(gòu)
ziplist結(jié)構(gòu)
下面我們來看一下ziplist的結(jié)構(gòu)
- zlbytes: ziplist的長度(單位: 字節(jié)),是一個32位無符號整數(shù)
- zltail: ziplist最后一個節(jié)點的偏移量,反向遍歷ziplist或者pop尾部節(jié)點的時候有用。
- zllen: ziplist的節(jié)點(entry)個數(shù)
- entry : ziplist中間儲存的節(jié)點
- zlend : 標記ziplist結(jié)尾
entry節(jié)點的結(jié)構(gòu)
- previous-entry_length : 用來存儲上一個節(jié)點的長度, 當前以節(jié)點的長度小于254字節(jié)時, 本身的長度為1字節(jié), 當前一節(jié)點的長度大于等于254時,自身長度為5字節(jié)
- encoding : 編碼 不同類型的編碼代表這個節(jié)點存儲的內(nèi)容和長度是什么
- content : 內(nèi)容, 這里就是具體存儲數(shù)據(jù)的地方
encoding按照下圖規(guī)則來可以看出來具體content存儲的是什么
添加或者刪除引起的連鎖更新
e1~en節(jié)點的長度均介于250 ~253之間, 當我在頭部新加了一個節(jié)點他的長度是254字節(jié), 那么e1就要更新他的previous_entry_length屬性, 要把原來1字節(jié)更新為5字節(jié), 這樣一更新, e2也要更新e1的長度, 這樣就引起了連鎖反應
當big節(jié)點長度大于等于254時, small節(jié)點的存儲前一節(jié)點長度的大小是5字節(jié), 但我們將small節(jié)點刪除后, e1存儲前一個節(jié)點的長度就不夠了, 這樣就需要更新, e1一更新, e2也要更新, 這樣就又發(fā)送了連鎖反應
連鎖更新造成的影響:
當然連鎖更新出現(xiàn)的概率很低, 并且當節(jié)點較少時, 出現(xiàn)連鎖更新對性能影響不大
總結(jié)
以上是生活随笔為你收集整理的Redis之压缩链表ziplist的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis之链表
- 下一篇: Redis之跳跃表(面试重点容易考)