Redis radix tree原始碼解析

2021-09-19 06:58:54 字數 1583 閱讀 7516

redis實現了不定長壓縮字首的radix tree,用在集群模式下儲存slot對應的的所有key資訊。本文將詳述在redis中如何實現radix tree。

raxnode是radix tree的核心資料結構,其結構體如下**所示:

typedef struct raxnode  raxnode;
isnull:是否有儲存value值,比如儲存元資料就只有key,沒有value值。value值也是儲存在data中

iscompr:是否有字首壓縮,決定了data儲存的資料結構

size:該節點儲存的字元個數

data:儲存子節點的資訊

以下用幾個示例來詳解rax tree插入的流程。假設j是遍歷已有節點的游標,i是遍歷新增節點的游標。

場景一:只插入abcd

z-ptr指向的葉子節點iskey=1,使用了壓縮字首。

場景二:在abcd之後插入abcdef

從abcd父節點的每個壓縮字首字元比較,遍歷完所有abcd節點後指向了其空子節點,j = 0, i < len(abcded)。

查詢到abcd的空子節點,直接將ef賦值到子節點上,成為abcd的子節點。ef節點被標記為iskey=1,用來標識abcd這個key。ef節點下再建立乙個空子節點,iskey=1來表示abcdef這個key。

場景三:在abcd之後插入ab

ab在abcd能找到前兩位的字首,也就是i=len(ab),j < len(abcd)。

將abcd分割成ab和cd兩個子節點,cd也是乙個壓縮字首節點,cd同時被標記為iskey=1,來表示ab這個key。

cd下掛著乙個空子節點,來標記abcd這個key。

場景四:在abcd之後插入ababc

abcabc在abcd中只找到了ab這個字首,即i < len(abcabc),j < len(abcd)。這個步驟有點複雜,分解一下:

場景五:在abcd之後插入aabc

abcd和aabc沒有字首匹配,i = 0,j = 0。

將abcd拆分成a、bcd兩個節點,a節點是乙個非壓縮字首節點。

將aabc拆分成a、abc兩個節點,a節點也是乙個非壓縮字首節點。

將a節點掛在和a相同的父節點上。

同上,在bcd和abc這兩個節點下掛空子節點來分別表示兩個key。

刪除刪除乙個key的流程比較簡單,找到iskey的節點後,向上遍歷父節點刪除非iskey的節點。如果是非壓縮的父節點並且size > 1,表示還有其他非相關的路徑存在,則需要按刪除子節點的模式去處理這個父節點,主要是做memove和realloc。

合併刪除乙個key之後需要嘗試做一些合併,以收斂樹的高度。

合併的條件是:

redis radix tree的簡單解釋

所有例子均出自原始碼。radix tree壓縮字首樹,是redis在5.0新加入的用來儲存key的資料結構。字首樹的節點結構如下。typedef struct raxnode raxnode 簡單來看乙個radix樹中的節點共分為五部分,前三者分別是三個標誌量,iskey代表從根節點到該節點的父節點...

官方源 映象源彙總

網易 http 阿里雲 http 上海交通大學 http ftp.sjtu.edu.cn html resources.xml 部分移動運營商出口狀況不佳,無法訪問 華中科技大學 http mirror.hust.edu.cn 當前已用容量估計 4.83t 清華大學 http mirrors.tun...

官方源 映象源彙總

網易 阿里雲 上海交通大學 部分移動運營商出口狀況不佳,無法訪問 華中科技大學 當前已用容量估計 4.83t 清華大學 當前已用容量估計 9.8t 北京理工大學 蘭州大學 中國科技大學 當前已用容量估計 21.32t 大連東軟資訊學院 當前已用容量估計 2.5t 東北大學 大連理工大學 哈爾濱工業大...