IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis之字典(hashtable) -> 正文阅读

[大数据]Redis之字典(hashtable)

字典是什么(hashtable)

简单来说就是Redis中hash数据结构的底层实现
当数据小, 并且数量不多的时候会用ziplist来实现hash结构

总体结构

这里先给出大体的结构, 便于理解
在这里插入图片描述

dict

字典底层又是由dict实现的, 下图是dict的结构
在这里插入图片描述

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

dictht[]数组长度为2, 一般我们使用dictht[0], 另外一个dictht[1]作为rehash使用

dictht(散列表)

接下来我们看一下dictht(散列表的实现)

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

dictEntry

  • dictEntry是一个散列表节点
    散列表的节点是由下定义的
//哈希表节点定义dictEntry结构表示,每个dictEntry结构都保存着一个键值对。
typedef struct dictEntry
{
         //键
         void *key;
         //值
         union{
           void *val;
            uint64_tu64;
            int64_ts64;
            }v;
         // 指向下个哈希表节点,形成链表
         struct dictEntry *next;
}dictEntry;
  • key就是实际存储键的地方
  • 联合体中就是实际存储值的地方
  • 散列表节点还有一个next域指向下一个节点, 可以用来解决哈希冲突问题

如何解决哈希冲突

1. 链表法

当有两个或以上的键被分配到散列表数组同一个索引上时,就发生了键冲突。Redis使用链表法解决散列冲突。
值得一提的是比如V0先加入这个节点中, 又来一个V1和V0的值一个都被分配 到了一个地址, 那么就会在V0的头部插入V1.
在这里插入图片描述

2.rehash法

随着操作的进行, dict内保存的键值对,会不断的减少或者增加, 我们需要保证负载因子的正常, 那么就要重新进行分配内存
这个时候dicht[1]就可以起到作用了, 并且rehashids也会设置为0表示正在rehash中
在这里插入图片描述
rehash的过程
1.为字典的ht[1]散列表分配空间,这个空间的大小取决于要执行的操作以及ht[0]当前包含的键值对数量(即:ht[0].used的属性值)

  • 扩展操作:ht[1]的大小为 第一个大于等于ht[0].used*2的2的n次方幂。如:ht[0].used=3则ht[1]的大小为8,ht[0].used=4则ht[1]的大小为8。
  • 收缩操作: ht[1]的大小为 第一个大于等于ht[0].used的2的n次方幂。

2.将保存在ht[0]中的键值对重新计算键的散列值和索引值,然后放到ht[1]指定的位置上. 当然这不是一步完成的, 是一部分一部分的赋值过去
3.当我们把ht[0]上面所有的键值对都给移过去到h[1]之后, 就会释放h[0]的空间, 并且将h[1]记为ht[0], 最后再创建一个新的ht[1]散列表为下一次rehash做准备。

这就是本次全部内容,若是看不懂建立配合着图来理解

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:54:27  更:2021-11-16 18:54:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:35:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码