Redis---Hash(字典)

1. 概述

  a. 它就是一个键值对,对于hash冲突的处理采用了头插法的链式存储来解决。

  b. 对rehash,扩展就是取第一个大于等于 used * 2 的2 ^ n的数作为新的hash表大小;缩紧就是取第一个大于等于 used 的2 ^ n的数作为新的hash表大小。

  c. 有个负载因子的概念(负载因子 = used / size),没有执行BGSAVE或者BGREWRITEAOF时 大于1就会扩展,小于0.1就会缩紧。

  d. dict结构体中是有dictht ht[2]这个成员变量的,2个是为了做rehash时交替使用的。渐进式rehash,在此过程中对于字典的删、改、查会在2个ht上面进行,而只会在新的ht上进行。

2. 基本结构

typedef struct dictEntry {
    void *key; ////
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next; // 指向下个节点的指针, hash 值相同的键值对构成单向链表 头插法
} dictEntry;

// 哈希表结构。 每个字典都有两个,因为我们实现了从旧表到新表的增量重写
typedef struct dictht {
    dictEntry **table;
    PORT_ULONG size; // hash 表大小
    PORT_ULONG sizemask; // 哈希表大小掩码,用于计算索引值,总是等于 size - 1
    PORT_ULONG used; // 节点个数
} dictht;

typedef struct dict {
    dictType *type; // 类型特定函数  实现多态
    void *privdata; // 私有数据
    dictht ht[2]; // 两个 hash table
    PORT_LONG rehashidx; // 如果rehashidx == -1则不进行重复
    int iterators; // 当前正在运行的迭代器数
} dict;

猜你喜欢

转载自www.cnblogs.com/virgosnail/p/9545179.html