Redis radix tree源码解析-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 期刊>>

期刊库

>>

Redis radix tree源码解析

Redis radix tree源码解析

发布:时光人 | 分类:期刊库

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

获取电子版《CDA一级教材》

完整电子版已上线CDA网校,累计已有10万+在读~ 教材严格按考试大纲编写,适合CDA考生备考,也适合业务及数据分析岗位的从业者提升自我。

完整电子版已上线CDA网校,累计已有10万+在读~ 教材严格按考试大纲编写,适合CDA考生备考,也适合业务及数据分析岗位的从业者提升自我。

Redis实现了不定长压缩前缀的radixtree,用在集群模式下存储slot对应的的所有key信息。本文将详述在Redis中如何实现radixtree。核心数据结构raxNode是radixtree的核心数据结构,其结构体如下代码所示:http://image. ...
坛友互助群


扫码加入各岗位、行业、专业交流群


Redis实现了不定长压缩前缀的radix tree,用在集群模式下存储slot对应的的所有key信息。本文将详述在Redis中如何实现radix tree。

核心数据结构

raxNode是radix tree的核心数据结构,其结构体如下代码所示:

http://image.uczzd.cn/12997014479359791878.jpg?id=0&from=export

iskey:表示这个节点是否包含key

0:没有key

1:表示从头部到其父节点的路径完整的存储了key,查找的时候按子节点iskey=1来判断key是否存在

isnull:是否有存储value值,比如存储元数据就只有key,没有value值。value值也是存储在data中

iscompr:是否有前缀压缩,决定了data存储的数据结构

size:该节点存储的字符个数

data:存储子节点的信息

iscompr=1:压缩模式下,数据格式是:[header strlen=3][xyz][z-ptr](value-ptr?),只有一个指针,指向下一个节点。size个字符是压缩字符片段

iscompr=0:非压缩模式下,数据格式是:[header strlen=0][abc][a-ptr][b-ptr][c-ptr](value-ptr?),有size个字符,紧跟着是size个指针,指向每个字符对应的下一个节点。size个字符之间互相没有路径联系。

Rax Insert

以下用几个示例来详解rax tree插入的流程。假设j是遍历已有节点的游标,i是遍历新增节点的游标。

场景一:只插入abcd

http://image.uczzd.cn/13606298901467311417.jpg?id=0&from=export

z-ptr指向的叶子节点iskey=1,使用了压缩前缀。

场景二:在abcd之后插入abcdef

http://image.uczzd.cn/16853522741275545647.jpg?id=0&from=export

从abcd父节点的每个压缩前缀字符比较,遍历完所有abcd节点后指向了其空子节点,j = 0, i < len(abcded)。查找到abcd的空子节点,直接将ef赋值到子节点上,成为abcd的子节点。ef节点被标记为iskey=1,用来标识abcd这个key。ef节点下再创建一个空子节点,iskey=1来表示abcdef这个key。

场景三:在abcd之后插入ab

http://image.uczzd.cn/3751861485331295129.jpg?id=0&from=export

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)。这个步骤有点复杂,分解一下:

step 1:将abcd从ab之后拆分,拆分成ab、c、d 三个节点。

step 2:c节点是一个非压缩的节点,c挂在ab子节点上。

step 3:d节点只有一个字符,所以也是一个非压缩节点,挂在c子节点上。

step 4:将ABC 拆分成了A和BC, A挂在ab子节点上,和c节点属于同一个节点,这样A就和c同属于父节点ab。

step 5:将BC作为一个压缩前缀的节点,挂在A子节点下。

http://image.uczzd.cn/14104647542024734211.jpg?id=0&from=export

step 6:d节点和BC节点都挂一个空子节点分别标识abcd和abcABC这两个key。

场景五:在abcd之后插入Aabc

http://image.uczzd.cn/10217066682431926768.jpg?id=0&from=export

abcd和Aabc没有前缀匹配,i = 0,j = 0。将abcd拆分成a、bcd两个节点,a节点是一个非压缩前缀节点。将Aabc拆分成A、abc两个节点,A节点也是一个非压缩前缀节点。将A节点挂在和a相同的父节点上。同上,在bcd和abc这两个节点下挂空子节点来分别表示两个key。

Rax Remove

删除

删除一个key的流程比较简单,找到iskey的节点后,向上遍历父节点删除非iskey的节点。如果是非压缩的父节点并且size > 1,表示还有其他非相关的路径存在,则需要按删除子节点的模式去处理这个父节点,主要是做memove和realloc。

合并

删除一个key之后需要尝试做一些合并,以收敛树的高度。

合并的条件是:

iskey=1的节点不能合并

子节点只有一个字符

父节点只有一个子节点(如果父节点是压缩前缀的节点,那么只有一个子节点,满足条件。如果父节点是非压缩前缀的节点,那么只能有一个字符路径才能满足条件)

结束语[url=Redis radix tree源码解析 http://news.uc.cn/a_2249067945962139756/?from=UCPC]Redis radix tree源码解析 http://news.uc.cn/a_2249067945962139756/?from=UCPC[/url]


扫码或添加微信号:坛友素质互助


「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-7057700-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
联系客服
值班时间:工作日(9:00--18:00)