Redis学习笔记(三) 字典「建议收藏」

Redis学习笔记(三) 字典「建议收藏」Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对。 redis字典所用的哈希表由disht结构定义。 typedef struct d

Redis学习笔记(三) 字典

Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对。

redis字典所用的哈希表由disht结构定义。

typedef struct dictht{
    dictEntry **table;//哈希表数组
    unsigned long size;//哈希表大小
    unsigned long sizemask;//哈希表大小掩码,用于计算索引值 ,总是等于size -1
    unsigned long used;//该哈希表已有节点数量
}

代码100分

table 属性是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存着一个键值对。其他的属性不多说。

 

哈希表节点

哈希表节点使用dictEntry结构标识,每个dictEntry保存一个键值对。

代码100分typedef struct dictEntry{
    void *key;//
    union{
    void *val;
    uint64_tu64"
    int64_ts64"
    } v;//
    struct dictEntry *next;//指向下个哈希节点,形成链表
} ductEntry;

*next 属性是指向另一个哈希表节点的指针,这个指针可以将多个哈希值相同的键值对连接在一起,解决键冲突的问题。所以,每一个哈希索引为一个单向链表。

 

Redis中的字典由dict结构表示:

typedef struct dict{
    dictType *type;//类型特定函数
    void *orivdata;//私有数据
    dictht ht[2];//哈希表
    int trehashidx;//rehash 索引 ,当rehash不再进行时,值为-1
} dict;

 

Redis计算哈希值和索引值的方法:

代码100分hash = dict->type->hashFunction(key);
index = hash & dict->ht[x].sizemask;

 

解决键冲突:

当两个或两个一个数量的键被分配到了哈希表数组的同一个索引上面时,为我们称作这些键发生冲突。Redis的哈希表使用链地址法来解决冲突,每个哈希表节点的next指针构成了一个单向链表,以此来解决键冲突。

另外由于链表没有指向链表结尾的指针,为考虑速度,每次将新加的节点放到链表表头位置(复杂度为O(1))。

 

Rehash

随着哈希表保存的键增多或减少,为了让哈希表的负载因子维持在一个合理的范围内,程序会对哈希表的小小进行rehash(重新散列)。

    1、为字典表的ht[1]哈希表分配空间,这个哈希表的空间大小取决于要执行的操作以及ht[0]包含的键值对数量

        (1)如果执行扩展,ht[1] =第一个>=ht[0].used * 2 的2的n次方幂。

        (2)如果收缩 ht[1] = 第一个>=ht[0].used 的2的n次方幂

    2、h[0] 迁移至h[1]。

    3、清空h[0],将h[1]设置为h[0],新建h[1]。

 

渐进式rehash 

字典表同时使用ht[0],ht[1],ht[0]通过索引计数器分批量的迁移至ht[1],为解决ht[0]所持有的键值对量太大的问题。

 

不为别的,每天学一点,总会有收获。

 

说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。

 

Redis学习笔记(三) 字典「建议收藏」

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8501.html

(0)
上一篇 2023-02-27 10:00
下一篇 2023-02-27 11:00

相关推荐

  • Python访问MySQL[亲测有效]

    Python访问MySQL[亲测有效]Python访问MySQL的步骤 创建connection连接,连接数据库 获取cursor游标对象 执行SQL语句 关闭cursor游标对象 关闭connection连接 import pymys…

    2023-03-24
    160
  • mysql开启事件[亲测有效]

    mysql开启事件[亲测有效]set global event_scheduler=on;

    2023-03-27
    163
  • 使用time.sleep(1)进行Python编程休眠操作

    使用time.sleep(1)进行Python编程休眠操作在进行Python编程过程中,我们常常需要进行休眠操作,即程序暂停一段时间。这时,我们可以使用Python中的time模块中的sleep()函数来实现。休眠操作在处理网络请求、爬虫、文件读写等领域都有广泛应用。

    2024-05-30
    65
  • mysql5.7 中文乱码_oracle数据库中文乱码怎么解决

    mysql5.7 中文乱码_oracle数据库中文乱码怎么解决脚本文件是utf-8,mysql数据库utf-8; 运行mysql文件,在navicat打开,中文注释乱码 解决方法如下: 5.5和5.6版本修复中文乱码后,运行mysql删除脚本,数据库存在遗漏的数

    2023-03-19
    147
  • Python Widget Digit,打造高效数字化界面

    Python Widget Digit,打造高效数字化界面在现代社会,数字化已成为各行各业的趋势,需要我们处理数字化信息的频率越来越高。数字处理和显示是我们日常工作的重点,因此,有一个高效的数字化界面是非常重要的。Python Widget Digit能够帮助我们快速、轻松地构建一个高效的数字化界面。

    2024-04-03
    69
  • Oracle 11g 数据库的部署[通俗易懂]

    Oracle 11g 数据库的部署[通俗易懂]新手入门之Oracle 11g部署 Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可…

    2023-03-20
    145
  • sql 算术运算符和比较运算符的区别_sql运算符优先级

    sql 算术运算符和比较运算符的区别_sql运算符优先级学习重点 运算符就是对其两边的列或者值进行运算(计算或者比较大小等)的符号。 使用算术运算符可以进行四则运算。 括号可以提升运算的优先顺序(优先进行运算)。 包含 NULL 的运算,其结果也是 NUL

    2023-04-26
    129
  • Python源码安装方法

    Python源码安装方法Python语言是一种解释型的高级程序设计语言。由于Python语言简洁易懂、代码可读性高、功能丰富、可扩展性强,已成为广泛使用的编程语言。如果您想要更加深入的了解Python语言的内部工作原理和机制,自行编译Python源码是一种不错的途径。同时,Python源码安装方法也是Python初学者需要了解的基本知识。

    2024-06-02
    52

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注