redis 系列——4、redis 字典

本文详细介绍了Redis字典的实现,包括哈希表、哈希算法、rehash过程、渐进式rehash以及字典API。Redis字典使用哈希表作为底层数据结构,采用链地址法解决冲突,并通过MurmurHash2算法进行哈希计算。当负载因子超过一定阈值时,Redis会进行扩容或缩容,rehash操作则采用渐进式策略以降低性能影响。
摘要由CSDN通过智能技术生成

概述

上篇博客我简单介绍了 redis 哈希表相关知识,本篇博客我打算在哈希表的基础上,简单整理一下 redis 字典的实现原理


字典

字典又称为符号表、关联数组,映射等,它是一种保存键值对的抽象数据结构。

字典中的键是独一无二的,程序可以在字典中根据键查找与之关联的值,或通过键来更新值,删除值等。它作为一种数据结构内置在许多编程语言中,但 redis 的开发语言C语言并没有实现这种数据结构,因此 redis 构建了自己的字典实现。

redis 字典就是使用上一节我们讲过的哈希表作为底层原理。关于哈希表的知识,可以点击这里参考上一篇博客内容。

redis 中的字典由头文件 dict.h 中的 dict 表示:

typedef struct dict {
   
    // 类型特定函数
    dictType *type;
    // 私有数据
    void *privdata;
    // 哈希表
    dictht ht[2];
    // rehash索引
    //当rehash不在进行时,值为-1
    in trehashidx; /* rehashing not in progress if rehashidx == -1 */
} dict;
  • type 属性是一个指向 dictType 类型结构的指针,每个 dictType 结构保存了一组用户操作特定类型变量的函数,redis 会为用途不同的字典设置不同的函数
  • privdata 属性保存了传给 type 函数的可选参数
  • ht 属性是一个包含两项的数组,数组中的每一项都是 dictht 类型的哈希表,一般情况下只需要使用 ht[0],ht[1] 是在数组 rehash 时使用的
  • trehashidx 属性也是在 rehash 时使用的,使用它来记录 rehash 的进度,如果目前没有进行 rehash,那么它的值是 -1

dictht 类型已经在上一篇博客介绍过,这里我们主要看看 dictType 类型的结构:

typedef struct dictType {
   
    // 计算哈希值的函数
    unsigned int (*hashFunction)(const void *key);
    // 复制键的函数
    void *(*keyDup)(void *privdata, const void *key);
    // 复制值的函数
    void *(*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值