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

相关推荐

  • 基于bfccss的Python工程实践

    基于bfccss的Python工程实践Python作为流行的编程语言之一,有着极高的实用价值和广泛的应用范围。而基于bfccss的Python工程实践则是结合bfccss这一优秀的Web框架和Python语言,实现高效的Web开发。本文将从多个方面详细的阐述基于bfccss的Python工程实践。

    2024-04-22
    19
  • Spring Cloud 系列之 Config 配置中心「终于解决」

    Spring Cloud 系列之 Config 配置中心「终于解决」  本篇文章讲解 Config 如何实现配置中心加解密,配置中心用户安全认证。   1|0配置中心加解密   考虑这样一个问题:所有的配置文件都存储在 Git 远程仓库,配置文件中的一些信息又是比较…

    2023-02-27
    102
  • 应用开发实践之关系型数据库(以MySql为例)小结[亲测有效]

    应用开发实践之关系型数据库(以MySql为例)小结[亲测有效]多年开发实践中遇到的DB相关的话题研究和整理,不介绍DB的基本概念,也不过于深入DB原理,以满足日常应用、知其然知其所以然为准。
    包含十几个子话题,含事务传播性、索引优化、拆分、FailOver等。

    2023-02-24
    100
  • 滴滴推理引擎IFX:千万规模设备下AI部署实践「终于解决」

    滴滴推理引擎IFX:千万规模设备下AI部署实践「终于解决」桔妹导读:「滴滴技术」将于本月开始,联合各技术团队为大家带来精彩分享。你想了解的技术干货,深度专访,团队及招聘将于每周三与你准时见面。本月为「滴滴云平台事业群分享月」,在今天的内容中,云平台事业群-…

    2023-04-04
    102
  • HBase 与 Cassandra 架构对比分析的经验分享[亲测有效]

    HBase 与 Cassandra 架构对比分析的经验分享[亲测有效]架构对比 HBase和Cassandra几乎是一个年份发起,又都是在2010年成为Apache的顶级项目,不过如果我们去细品其内部机制,我们会发现其实两者是完全不同的架构风格。 HBASE起源于Goo

    2023-04-24
    125
  • PG TO Oracle 增量同步-外部表[通俗易懂]

    PG TO Oracle 增量同步-外部表[通俗易懂]背景 最近在负责公司数据Oracle转PG;老平台数据库:Oracle11g;新平台数据库:PostgreSQL12。由于平台统计规则有变动;所以正在推广的游戏数据无法全部迁移过来;只能在老平台上运行

    2023-02-22
    116
  • Python可以使用if语句定义条件语句

    Python可以使用if语句定义条件语句Python是一种高级编程语言,如果您在编写代码时需要执行具有不同条件的不同操作,您可以使用条件语句if。Python的if语句提供了一个简单的方法来判断特定条件是否为真,并且根据条件的结果,执行不同的代码段。

    2024-03-18
    32
  • Python Renames:轻松更改文件名的利器

    Python Renames:轻松更改文件名的利器对于一个Python工程师来说,更改文件名是一个经常会遇到的问题。虽然更改文件名对于普通用户来说似乎是一个简单的任务,但是想要以编程的方式实现更改文件名就需要使用Python。

    2024-01-10
    64

发表回复

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