redis 存储结构原理 2

发布时间:2023-11-27 15:00

咱们接着上一部分来进行分享,我们可以在如下地址下载 redis 的源码

https://redis.io/download

redis 存储结构原理 2_第1张图片

此处我下载的是 redis-6.2.5 版本的,xdm 可以直接下载上图中的 redis-6.2.6 版本,

redis 中 hash 表的数据结构

redis hash 表的数据结构定义在:

redis-6.2.5\src\dict.h

哈希表的结构,每一个字典都有两个实现从旧表到新表的增量重哈希

redis 存储结构原理 2_第2张图片

typedef struct dictht {
    dictEntry **table;
    unsigned long size;
    unsigned long sizemask;
    unsigned long used;
} dictht;

table:

table 是一个二级指针,对应这一个数组,数组中的每个元素都是指向了一个 dictEntry 结构体指针的,dictEntry 具体的数据结构是保存一个键值对

具体的 dictEntry 数据结构是这样的:

redis 存储结构原理 2_第3张图片

size:

size 属性是记录了整个 hash 表的大小,也可以理解为上述 table 数组的大小

sizemask:

sizemask 属性,和具体的 hash 值来一起决定键要放在 table 数组的哪个位置

sizemask 的值,总是会比 size 小 1 ,我们可以来演示一下

redis 存储结构原理 2_第4张图片

使用取余的方式,实际上是很低效的,咱们的计算机是不会做乘除法的,同样都是用加减法来进行处理的,为了高效处理,我们可以使用二进制的方式

使用二进制的方式,就会用到该字段 sizemask ,主要是用来 和 具体的 hash 值做按位与操作

redis 存储结构原理 2_第5张图片

如图就很明确了, size = 4,sizemask = 3,hash 值为 7, 最后 hash 值 & sizemask = 0011, 也就是 3,因此就会插入到上图的具体位置

used:

used 属性表示 hash 表里面已经有键值对的数量

对于上述的案例,可以用一个简图来表示一下 hash 表结构 dictht

redis 存储结构原理 2_第6张图片

dictEntry 结构每个属性的含义

typedef struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next;
} dictEntry;

上面我们看到数组中的节点信息,是 dictEntry 结构,属性分别是这些意思:

  • key

    具体的 redis 键

  • union v

    • val

      指向不同类型的数据,此处是 void * ,使用该类型,是为了节省内存

    • u64

      用于 redis 集群中的哨兵模式和选举模式

    • s64

      记录过期时间的

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号