Redis深度历险-Redis基数树内部源码结构

Rax Tree

Rax是Redis内部比较特殊的一个数据结构,它是一个有序字典树(基数树Radix Tree),按照key的字典序排列,支持快速地定位、插入和删除操作;Redis五大基础数据结构里面能作为字典使用的有hash和zset,hash不具备排序功能,zset则是按照score进行排序的;rax跟zset的不同在于它是按照key进行排序的

基数树的讲解参考:https://www.cnblogs.com/wgwyanfs/p/6887889.html

应用

可以将一本英语字典看成一棵radix tree,他所有的单词都是按照字典顺序进行排列,每个词汇都会附带一个解释,这个解释就是key对应的value;有了这棵树就可以快速地检索单词,还可以查询以某个前缀开头的单词有哪些

1、可以将公安局的人员档案信息看成一棵radix tree,它的key是每个人的身份证号,value是个人的履历;因为身份证好的边妈的前缀是按照地区进行一级一级划分的;有了这棵树就可以快速定位出人员档案,还可以快速查询出某个小片区都有哪些人

2、Radix tree还可以应用于时间序列应用,key为时间戳,value为发生在具体时间的事件内容;因为时间戳的编码也是按照“年月日时分秒毫秒微妙纳秒”进行一级一级划分的,所以它也可以使用字典序来排序;有了这棵树,我们就可以快速定位出某个具体时间发生了什么事,也可以查询初一短时间内都有哪些事发生

3、我们经常使用的Web服务器的Router也是一棵radix tree,这科书上挂满了URL规则,每个URL规则上都会附上一个请求处理器;当一个请求到来事,我们那这个请求的URL沿着树进行遍历,找到相应的请求处理器来处理;因为URL中可能存在正则表达式(pattern),而且同一层的节点对顺序没有要求,所以它不算是一棵严格的radix tree

Rax备用在Redis Stream结构里面用于存储消息队列,在Stream里面消息ID的前缀是时间戳+序号,这样的消息可以理解为时间序列消息;使用Rax结构进行存储就可以快速地根据消息ID定位到具体信息,然后继续遍历指定消息之后的所有消息

结构

rax中有非常多的节点,根节点、叶节点和中间节点,有写中间节点带有value,有写中间节点纯粹是结构性需要没有对应的value

struct raxNode {
    int<1> isKey; // 是否没有 key,没有 key 的是根节点
    int<1> isNull; // 是否没有对应的 value,无意义的中间节点
    int<1> isCompressed; // 是否压缩存储,这个压缩的概念比较特别
    int<29> size; // 子节点的数量或者是压缩字符串的长度 (isCompressed)
    byte[] data; // 路由键、子节点指针、value 都在这里
}

rax十一课比较特殊的radix tree,它在结构上不是标准的radix tree;如果一个中间节点有多个子节点,那么路由键就只是一个字符串;后这就是所谓的“压缩”形式,多个字符压在一起的字符串,比如前面那棵字典树在Rax算法中将呈现如下结构:

图中深蓝色节点就是“压缩”节点

接下来我们再细看raxNode.data里面存储的到底是什么,它是一个比较复杂的结构,按照压缩与否分为两种结构

 

压缩结构 子节点如果只有一个,那就是压缩结构,data字段如下伪代码所示:

struct data {
        optional struct { // 取决于 header 的 size 字段是否为零
        byte[] childKey; // 路由键
        raxNode* childNode; // 子节点指针
    } child;
    optional string value; // 取决于 header 的 isNull 字段
}

如果是叶子节点,child字段就不存在;如果是无意义的中间节点(isNull),那么value字段就不存在

 

非压缩节点 如果子节点有多个,那就不是压缩结构,存在多个路由键,一个键是一个字符

struct data {
    byte[] childKeys; // 路由键字符列表
    raxNode*[] childNodes; // 多个子节点指针
    optional string value; // 取决于 header 的 isNull 字段
}

如果子节点只有一个,并且路由键字符串长度为1么,那到底算压缩还是非压缩?仔细思考一下,在这种情况下,压缩和非压缩在数据结构表现形式上是一样的,不管isCompressed是0还是1结构都是一样的

增删节点

增删节点请参考:https://www.cnblogs.com/wgwyanfs/p/6887889.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Redis是一款内存数据库,性能高、支持多种数据结构、提供丰富的功能,得到了广泛的应用。但其维护操作却需要一定的技巧,开源社区中也有大量的文档、文章来讲解。其中,Redis深度历险一书介绍了Redis的基础知识、高级特性、应用场景和实战案例。该书深入剖析了Redis内部的实现原理,让读者更好地理解其运行机制、调优方法和错误排查。主要内容包括Redis线程模型、内存优化、IO模型、事务、持久化、集群、性能调优、应用场景等。其中,集群方面包括Redis Cluster和Redis Sentinel两类架构的详细介绍和使用方法。性能调优方面,介绍了一些常见的性能问题和解决方案,以及使用Redis的最佳实践。对于有一定Redis使用经验的开发人员或系统工程师,这本书可以帮助他们更好地优化和管理Redis实例,也可以让他们更深入地掌握Redis相关知识。对于想学习Redis的初学者,建议还需要通过其他资料了解Redis基本概念和用法。总的来说,Redis深度历险是一本值得阅读的Redis专业书籍,它为读者提供了许多经验和实践经验,也为企业中使用Redis的团队提供了宝贵的参考资料。 ### 回答2: Redis是一款开源的高性能NoSQL数据库,近年来在企业级应用中广受欢迎。《Redis深度历险》是一本深入介绍Redis的技术书籍,由黄健宏等人撰写。 这本书详细介绍了Redis的架构、原理、数据结构、使用场景、性能优化、集群部署等方面的知识,通过系统化的学习可以在Redis的使用和优化方面获得很大的收获。 《Redis深度历险》中包含大量的实际代码示例和生产环境中的案例分析,可以帮助读者深入理解Redis的实现细节和应用场景,并快速应用到自己的实战项目中。同时,这本书也适合那些想深入了解分布式系统的架构师、程序员、运维工程师等 IT 技术人员。 此外,书中还介绍了很多Redis的新特性和应用场景,如Redis的流式计算、Redis与gRPC的结合使用等,让人们对Redis的使用和应用场景有了更深刻的认识。 总之,《Redis深度历险》是一本非常实用的Redis技术指南,对于想深入学习Redis的技术人员来说是非常必备的一本读物。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值