Redis radix tree源码解析

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

核心数据结构

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

typedef struct raxNode {uint32_t iskey:1;     uint32_t isnull:1;    uint32_t iscompr:1;   uint32_t size:29;     unsigned char data[];
} raxNode;
  • iskey:表示这个节点是否包含key

    • 0:没有key
    • 1:表示从头部到其父节点的路径完整的存储了key,查找的时候按子节点iskey=1来判断key是否存在
  • isnull:是否有存储value值,比如存储元数据就只有key,没有value值。value值也是存储在data中
  • iscompr:是否有前缀压缩,决定了data存储的数据结构
  • size:该节点存储的字符个数
  • data:存储子节点的信息

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

Rax Insert

以下用几个示例来详解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)。这个步骤有点复杂,分解一下:

  • 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子节点下。
  • step 6:d节点和BC节点都挂一个空子节点分别标识abcd和abcABC这两个key。

场景五:在abcd之后插入Aabc

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的节点不能合并
  • 子节点只有一个字符
  • 父节点只有一个子节点(如果父节点是压缩前缀的节点,那么只有一个子节点,满足条件。如果父节点是非压缩前缀的节点,那么只能有一个字符路径才能满足条件)

结束语

云数据库Redis版(ApsaraDB for Redis)是一种稳定可靠、性能卓越、可弹性伸缩的数据库服务。基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版两套高可用架构。提供了全套的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案。欢迎各位购买使用:云数据库 Redis 版


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

针对提高48V 配电性能的诸多思考!

作者&#xff1a;Phil Davies 众所周知配电网络 (PDN) 是所有电源系统的主干部分&#xff0c;但随着系统电源需求的不断上升&#xff0c;传统 PDN 承受着提供足够性能的巨大压力。 对于功耗和热管理而言&#xff0c;主要有两种方法可以改善 PDN 对电源系统性能的影响&#x…

android线性布局快捷键,【整理】Android图形界面知识学习与总结之:Linear Layout线性布局...

【背景】之前已经学习了&#xff1a;现在接着去学习&#xff1a;整理如下&#xff1a;Linear Layout1.LinearLayout是一个视图组合2.LinearLayout中的子视图只能已单个方向排列&#xff0c;要么是水平&#xff0c;要么是垂直&#xff1b;4.所有如果是垂直的列表&#xff0c;则每…

收藏!企业数据安全防护5条建议

引言&#xff1a;数据安全对企业生存发展有着举足轻重的影响&#xff0c;数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失&#xff0c;而往往绝大多数中小企业侧重的是业务的快速发展&#xff0c;忽略了数据安全重要性。近年来&#xff0c;企业由于自身的…

容器安全拾遗 - Rootless Container初探

近期Docker 19.03中发布了一个重要的特性 “Rootless Container支持”。趁着五一假期&#xff0c;快速验证一下。本文参考了Experimenting with Rootless Docker 一文的内容&#xff0c;并且补充了更多的细节和上手内容。 Rootless容器背景与架构 Docker和Kubernetes已经成为…

android 参数 attrs.xml,使用attrs.xml自定义属性

控件有很多属性&#xff0c;如android:id、android:layout_width、android:layout_height等&#xff0c;但是这些属性都是系统自带的属性。使用attrs.xml文件&#xff0c;可以自己定义属性。本文在Android自定义控件的基础上&#xff0c;用attrs.xml文件自己定义了属性。首先&a…

直面PHP微服务架构挑战

在4月20日的阿里云栖开发者沙龙PHP技术专场上&#xff0c;云智慧Technical VP高驰涛为大家介绍了微服务的前世今生&#xff0c;分享了微服务架构实践中所面对的诸多挑战以及相应的应对策略。 本次直播视频精彩回顾&#xff0c;戳这里&#xff01; 直播回顾&#xff1a;https://…

5亿整数的大文件,怎么排序 ?面试被问傻!

来源 | 程序员追风编辑 | Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;最近一家公司&#xff0c;面试官一上来&#xff0c;就问了我这么一个问题&#xff0c;我一脸懵逼&#xff0c;决定记录一下。问题给你1个文件bigdata&#xff0c;大小4663M&…

RabbitMQ 的延时队列和镜像队列原理与实战

在阿里云栖开发者沙龙PHP技术专场上&#xff0c;掌阅资深后端工程师、掘金小测《Redis深度历险》作者钱文品为大家介绍了RabbitMQ的延时队列和镜像队列的原理与实践&#xff0c;重点比较了RabbitMQ提供的消息可靠与不可靠模式&#xff0c;同时介绍了生产环境下如何使用RabbitMQ…

深入浅出网络编程与Swoole内核

在阿里云PHP技术沙龙专场中&#xff0c;阿里云邀请到php-nsq作者&#xff0c;pecl、Swoole开发组成员吴振宇分享了Swoole进程模型的原理与Swoole协程实现的原理。并结合具体开发案例讲解了Swoole在网络编程中的应用。 本次直播视频精彩回顾&#xff0c;戳这里&#xff01; 直播…

Spark大数据分布式机器学习处理实战 | 博文精选

作者| 数挖小飞飞编辑 | Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;Spark是一种大规模、快速计算的集群平台&#xff0c;本文试图通过学习Spark官网的实战演练笔记提升作者实操能力以及展现Spark的精彩之处。本文的参考配置为&#xff1a;Deepin 1…

五四,阿里巴巴新青年了解下?

今天&#xff0c;橙子挖掘了几位程序员小哥的故事&#xff0c;他们是淘宝技术节上涌现出的“高手”。为了追求极致&#xff0c;代码也能成为一种艺术&#xff0c;看完之后也许你会对技术人有完全不同的认识。 1 伯灵&#xff1a;“技术作品代表我对技术的态度&#xff1a;解决…

多场景下的AI疫情防控“天网”:解读云边端联动下的全栈 AI 技术

在全民抗疫的特殊时期下&#xff0c;伴随着春运返潮&#xff0c;企业陆续复工&#xff0c;从重点防控的机场、火车站&#xff0c;到学校、企业、社区等密集型场所&#xff0c;都是不能忽视的地点。除了人工逐一测量体温排查外&#xff0c;我们还发现&#xff0c;在人员复杂、流…

Twitter 宣布抛弃 Mesos,全面转向Kubernetes

美国西部时间 5 月 2 日下午 7 点&#xff0c;Twitter 公司在旧金山总部举行了一次技术发布会兼 Meetup。会上&#xff0c;Twitter 计算平台&#xff08;Twitter Computing Platform&#xff09;产品与技术负责人 David McLaughlin 正式宣布&#xff0c;Twitter 的基础而设施将…

Guns整合log4j2

文章目录一、排除内置logback1. 删除logback.xml2. 排除内置的logback二、整合log4j22.1. 依赖log4j22.2. 配置文件中配置2.3. log4j2日志文件2.4. 效果图2.5. 输出要素Sringboot 开源框架默认logback日志框架&#xff0c;Guns开源项目也是用logback日志框架 一、排除内置logba…

蚂蚁金服生产级 Raft 算法库存储模块剖析 | SOFAJRaft 实现原理

前言 SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现&#xff0c;支持 MULTI-RAFT-GROUP&#xff0c;适用于高负载低延迟的场景。 SOFAJRaft 存储模块分为&#xff1a; Log 存储记录 Raft 配置变更和用户提交任务日志&#xff1b;Meta 存储即元信息存储记录…

android studio 调用c++,android studio配置opencv,调用c++,处理图像

一、下载安卓的opencv sdk这里下载release版的&#xff0c;下载后解压二、新建工程三、编写界面布局(工程等下上传到github)四、添加Module&#xff0c;Android Studio菜单-->File-->New-->Import Module添加完成五、加入依赖此时Sync报错&#xff0c;需要修改文件修改…

Guns mybatisplus只输出sql不输出结果集

文章目录1. yml配置2. 效果图今天给大家讲一下在数据量特别大的场景下&#xff0c;Guns开源项目怎样实现只输出sql不输出结果集列表。 1. yml配置 mybatis-plus:typeAliasesPackage: cn.stylefeng.guns.modular.system.modelmapper-locations:- classpath*:cn/stylefeng/guns/…

AWS还是Firebase?在移动应用后端应该使用哪个?

作者| Dhananjay Trivedi翻译 | 天道酬勤&#xff0c;编辑 | Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;我们将按以下顺序比较这两种服务&#xff1a;它们有什么共同点&#xff1f;如何将它们与你的前端集成&#xff1f;它们的优势。它们的价格。创…

对话鲁直:蚂蚁金服中间件的开源头羊 | 穿山甲专访

谈话中&#xff0c;鲁直反问的“你为什么不开源&#xff1f;”这句话让我印象深刻。-- 老王 二月初春&#xff0c;在西子湖畔的细雨中&#xff0c;我拜访了蚂蚁金服中间件团队&#xff0c;和 SOFA 技术负责人鲁直做了一次深入交谈&#xff0c;更妙的是&#xff0c;鲁直也是负责…

与时间赛跑:微盟的数据恢复为什么需要这么长时间

作者| 茹炳晟责编 | Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;微盟“删库跑路“事件已经过去好几天了&#xff0c;据悉&#xff0c;微盟的服务已经全部恢复&#xff0c;对于新用户&#xff0c;已经能够正常开始所有相关的业务活动了&#xff0c;但…