redis中的数据结构设计-字典

Dict

Dict是redis中实现的一种字典数据结构, 并且也是作为redis整个设计体系中的基石

dictEntry

dictEntry是字典中的节点

typedef struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next;
} dictEntry;
  • dictEntry的成员特性如下
    • keyvoid*类型, 代表其可以指向任意类型, 依靠这一点dict便可以实现键的伪泛型
    • v是共用体, 不论是val,u64,s64,d都是8字节大小, 同时由于valvoid*, 代表其可以指向任意类型, 依靠这一点可以实现值的伪泛型
    • next是指向下一节点的指针, redis的dict对于冲突的哈希键采取的是开放链表法

dictType

dictType是redis中用来实现泛型字典的一种关键数据结构, 其定义了特定类型字典的键、值释放函数(keyDestructor valDestructor)、复制函数(keyDup valDup),以及键的比较函数(keyCompare)

typedef struct dictType {
    uint64_t (*hashFunction)(const void *key);
    void *(*keyDup)(void *privdata, const void *key);
    void *(*valDup)(void *privdata, const void *obj);
    int (*keyCompare)(void *privdata, const void *key1, const void *key2);
    void (*keyDestructor)(void *privdata, void *key);
    void (*valDestructor)(void *privdata, void *obj);
} dictType;

dictht

dictht是字典中的哈希表,

typedef struct dictht {
    dictEntry **table;
    unsigned long size;
    unsigned long sizemask;
    unsigned long used;
} dictht;
  • table, table是一个数组, 用来存放节点的指针, 元素类型为dictEntry*
  • size, 哈希表大小
  • sizemask, 哈希表大小的掩码, 该数据字段主要用于计算索引其值 = size -1
  • used, 由于redis的dict维护两个table, 一个table用于存放数据, 另一个用于作rehash操作, 所以需要有一个字段标识真正使用的是哪个table

dict

struct dict是redis中的字典实现, 其中维护了一个字典所需要的元数据

typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];
    long rehashidx;
    unsigned long iterators;
} dict;
  • type, 用于存储字典的泛型处理函数
  • privdata, 用于存放私有数据
  • ht[2], 每个字典都有两个dictht成员以便做rehash的时候使用. 主要是为了避免字典数据过多时, 由于哈希冲突影响性能
  • rehashidx rehash
  • iterators, 当前字典迭代器的个数

dictIterator

typedef struct dictIterator {
    dict *d;
    long index;
    int table, safe;
    dictEntry *entry, *nextEntry;
    long long fingerprint;
} dictIterator;
typedef void (dictScanFunction)(void *privdata, const dictEntry *de);
typedef void (dictScanBucketFunction)(void *privdata, dictEntry **bucketref);


#define DICT_HT_INITIAL_SIZE 4

dict示意图在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值