快速串列簡介
在Redis3 .2版本之前,存盤串列(list)資料結構使用的是壓縮串列(ziplist)和鏈表(linkedlist),當串列元素個數比較少并且每個元素占用空間比較小的時候,使用壓縮串列,當串列元素個數比較多或者某個元素占用空間比較大的時候,使用鏈表,
考慮到鏈表的附加空間相對太高,結點的記憶體也是單獨分配的,影響記憶體管理效率,在Redis3 .2版本開始對串列資料結構進行了改造,使用快速串列(quicklist)代替了壓縮串列(ziplist)和鏈表(linkedlist),
快速串列(quicklist)是以壓縮串列(ziplist)為節點的鏈表(linkedlist),將鏈表按段切分,每一段使用壓縮串列進行記憶體的連續存盤,多個壓縮串列通過prev和next指標組成的雙向鏈表,它結合了壓縮串列和鏈表的優勢,進一步壓縮了記憶體的使用量,進一步提高了效率,
下面我們了解一下快速串列的具體實作,
快速串列的實作
在Redis中的快速串列是由quicklist結構表示的,quicklist結構包含由多個快速串列結點組成的雙向鏈表,每一個快速串列結點都保存了一個壓縮串列,下面我們一個一個地詳細了解一下,
quicklist結構
快速串列是由quicklist結構表示的,它包含以下幾個屬性:
head屬性: 指向頭部快速串列結點的指標,tail屬性:指向尾部快速串列結點的指標,count屬性:在所有壓縮串列中元素的個數總和,len屬性:快速串列結點的個數,fill屬性:壓縮串列的最大大小,存放list-max-ziplist-size引數的值,當超出了這個配置,就會新建一個壓縮串列,compress屬性:結點壓縮深度,存放list-compress-depth引數的值,bookmarks屬性:用來快速串列重新分配記憶體空間時使用的陣列,不使用時不占用空間,bookmark_count屬性:bookmarks陣列的大小,
快速串列結點
快速串列結點使用quicklistNode結構表示,它包含以下幾個屬性:
prev屬性:指向前一個快速串列結點的指標,next屬性:指向后一個快速串列結點的指標,zl屬性:指向壓縮串列的指標,如果當前結點的資料被壓縮,那么它指向一個quicklistLZF結構,sz屬性:壓縮串列的所占位元組總數,count屬性:壓縮串列中的元素數量,encoding屬性:存盤形式,原生位元組陣列還是LZF壓縮存盤,recompress屬性:當查看了某一項被壓縮的資料時,需要把資料暫時解壓,這時就設定 recompress = 1 做一個標記,等有機會再把資料重新壓縮,
quicklistLZF結構
當快速串列結點資料被壓縮時,資料會被存放在quicklistLZF結構中,它包含以下幾個屬性:
sz屬性:表示壓縮后的大小,compressed屬性:存放壓縮后的位元組陣列,
快速串列的壓碩訓制
在快速串列中,兩端結點的資料被訪問的可能性比較高,中間結點的資料被訪問的可能性比較低,如果我們的應用場景符合這個特點,可以把中間結點的資料使用 LZF 演算法進行壓縮,從而進一步節省記憶體空間,我們可以對list-compress-depth引數進行配置,
默認情況下,list-compress-depth引數為0,也就是不壓縮資料;當該引數被設定為1時,除了頭部和尾部之外的結點都會被壓縮;當該引數被設定為2時,除了頭部、頭部的下一個、尾部、尾部的上一個之外的結點都會被壓縮;當該引數被設定為2時,除了頭部、頭部的下一個、頭部的下一個的下一個、尾部、尾部的上一個、尾部的上一個的上一個之外的結點都會被壓縮;以此類推,
最后,謝謝你這么帥,還給我點贊和關注,
微信公眾號:萬貓學社
微信掃描二維碼
關注后回復「電子書」
獲取12本Java必讀技術書籍
作者:萬貓學社
出處:http://www.cnblogs.com/heihaozi/
著作權宣告:本文遵循 CC 4.0 BY-NC-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
微信掃描二維碼,關注萬貓學社,回復「電子書」,免費獲取12本Java必讀技術書籍,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/446979.html
標籤:Java
上一篇:Java將彩色PDF轉為灰度
