Redis深度历险-基数树

2021-08-18  本文已影响0人  突击手平头哥

Redis深度历险-基数树

Redis中的基数树是一种有序字典树,zset也是一种有序字典但是是按照score进行排序的,rax是按照key进行排序的;平衡二叉树、跳表都可以用来实现这种有序集合,不过要考虑复杂度

数据结构

数据结构

基数树简图.png

基数树有点类似与前缀树trie树,主要用于Redis Stream中存储消息队列,因为消息的key是时间戳+序号,而时间戳的编码也是按照年月日时分秒毫秒微秒纳秒一级一级划分
有以下特点:

节点

typedef struct raxNode {
    uint32_t iskey:1;     //用来标识根节点,没有key的是根节点
    uint32_t isnull:1;    //标志数据结构所需的中间节点,没有存储value
    uint32_t iscompr:1;   //是否压缩存储
    uint32_t size:29;     //子节点数量或压缩字符串的长度
    unsigned char data[];   //数据
} raxNode;

raxNode有多种情况

压缩节点

在代码中并没有通过结构体表述出来,而是通过内存排布来决定的

[header iscompr=1][xyz][z-ptr](value-ptr?)

压缩结构.png

一个压缩节点的data包含三部分

非压缩节点

非压缩结构.png

主要有两部分:

总结

  涉及到这种内存操作的逻辑会非常复杂,很容易陷入细节逻辑中,有时间再补充细节吧

上一篇下一篇

猜你喜欢

热点阅读