redis中的dict

redis中用dict 表示一个字典
typedef struct dict {

    // 类似sds定义一组函数指针
    dictType *type;

    // 私有数据
    void *privdata;

    // 哈希表
    dictht ht[2];

    // 当没有进行rehash操作是值为-1
    int rehashidx; /* rehashing not in progress if rehashidx == -1 */

    // 迭代器的数量
    int iterators; /* number of iterators currently running */

} dict;
这个dict中有两个重要的数据结构
其一是:
typedef struct dictType {

    unsigned int (*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;
这个dictType定义了六个函数指针,这些函数指针的意义都很明确
其二是:哈希表
typedef struct dictht {
    
    // 哈希表数组
    dictEntry **table;
    unsigned long size;
      // 总是等于 size - 1
    unsigned long sizemask;
    // 该哈希表已有节点的数量
    unsigned long used;
} dictht;
其中的table 表示哈希表数组,其单个节点的数据类型定义如下:
typedef struct dictEntry {
    
    // 键
    void *key;

    // 可以看出哈希表可以保存三类数据数据类型
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
    } v;

    // 指向下个哈希表节点,形成链表
    struct dictEntry *next;

} dictEntry;

调用dictCreate 可以新建一个字典,看来新建dict的时候必须制定六个函数指针和私有数据
dict *dictCreate(dictType *type,
        void *privDataPtr)
{
	#申请memory 并清零
    dict *d = zmalloc(sizeof(*d));

    _dictInit(d,type,privDataPtr);

    return d;
}


int _dictInit(dict *d, dictType *type,
        void *privDataPtr)
{
    // 两个哈希表赋初值
    _dictReset(&d->ht[0]);
    _dictReset(&d->ht[1]);
	// 成员变量根据形参赋初值或者默认值

    d->type = type;
    d->privdata = privDataPtr;
    d->rehashidx = -1;
    d->iterators = 0;

    return DICT_OK;
}
//给两个哈希表赋初值
static void _dictReset(dictht *ht)
{
    ht->table = NULL;
    ht->size = 0;
    ht->sizemask = 0;
    ht->used = 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值