redis中的字典与hash结构

面试官:说说Redis中Hash数据类型的底层结构 前言 本文将介绍Redis中Hash数据结构的底层结构,字典。 概述 字典,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构。在字典中,一个键(key )可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。 字典经常作为一种数据结构内置在很多高级编程语言里面,但Redis所使用的C语言并没有内置这种数据结构,因此 Redis构建了自己的字典实现。 字典在Redis中的应用相当广泛,比如 Redis的数据库就是使用字典来作为底层实现的,对数据库的增 阅读详情

字典是redis中的一种数据结构实现,用来保存键值对。

字典中的每个键都是独一无二的,程序可以根据键来找到与之关联的值。


redis的数据库的底层实现是字典,对于数据库的增删改查操作也都是通过对字典进行操作来实现的。

字典还是hash键的底层实现之一,如果一个hash键包含的键值对比较多或字符串长度比较长的时候,redis就会使用字典作为hash键的底层实现。

---------------------------------------------------


redis的字典底层实现为hash表、



hash表由dict.h/dictht结构定义:

typedef struts dictht{
  //哈希表数组
  dictEntry **table;
  //哈希表数组
  unsigned long size;
  //哈希表大小掩码,用于计算索引值
  //总是等于size-1
  unsigned long sizemask;
  //该hash表已有节点的数量
  unsigned long used;
}dictth;
table属性是一个数组,每个元素指向一个 hash表节点的指针。


hash表节点的由dict.h/dictEntry结构定义

<pre name="code" class="cpp">typedef struts dictEntry{
  //键
  void *key;
  //值  
 union{
     void *val;
     uint64_tu64;
     int64_ts64;
  }
  //指向下个hash表节点,形成链表
  strut dictEntry *next;
}dictEntry;


键值对的值可以是指针,uint64_t整数,或者是int64_t整数。

next属性的作用是:如果多个键值对的hash值相同,它们会成为一个单向链表,来解决冲突。

redis中的字典由 dict.h/dict结构来定义

typedef struts dict{
<pre name="code" class="cpp"><pre name="code" class="cpp">  //类型特定函数
  dictType *type;
  //私有数据
  void *private;
 //hash表
  dictth ht[2]
  //rehash索引
  //当rehash不再进行的时候,值为-1
 int trehashidx;
}dict;



type属性和private属性针对不同类型的键值对,用来创建多态字典。

dictType结构保存了一些用于操作键值对的函数,redis会为用途不同的字典设置不同的函数。

private保存了传给函数的 参数。

ht属性保存了两个hash表,通常情况下只使用一个hash表,另一个hash表用作复制。


该图展示了一个普通状态下的字典:




--------------------------------------------------------------------------------------


当一个键值对需要存储到字典中的时候,

1 .程序会使用hash算法根据 键值算出该键的hashcode,

2. 根据key算出的hashcode与sizemask属性算出该键值对的索引。

3. 根据索引将该键值对放在hash表数组的指定索引上。

   3.1 如果在该索引位置已经存在了键值对,则会形成单向链表,而且会把新加入的键值对放在该链表的表头。

   3.2如果没有,则直接加入。


rehashc操作

在不断加入新数据的过程中,为了减小hash表的负载因子,程序会通过rehash操作对hash表的大小进行拓展或伸缩。

该操作就用到了字典中的 h【0】 和 h【1】。

负载因子=ht【0】.used / ht【0】.size

当负载因子小于0.1的时候程序会执行收缩操作。

扩展:ht[1] >= ht[0].used*2 的 2^n
收缩 : ht[1] = ht[0].used 的 2^n

          rehash操作的时候,rehash动作是分多次,渐进式的完成的。避免了集中式rehash带来的庞大计算量。

在进行渐进式rehash操作期间,在字典中添加新值的时候 会保存在h[1]中,h[0]中的键值对只会减少,不会增加。



Redis第九讲 Redis之Hash数据结构Dict字典哈希算法与hash存储过程 Redis第九讲 Redis之Hash数据结构Dict字典哈希算法Redis第九讲 Redis之Hash数据结构Dict字典哈希算法Redis第九讲 Redis之Hash数据结构Dict字典哈希算法 阅读详情

相关推荐

ESP-IDF的安装及其在VScode中编译环境的搭建

从安装目录的\Espressif\frameworks\esp-idf-v5.3.2\examples路径中拷贝一个工程到项目中,比如拷贝\get-started下的hello_world文件夹。安装时可能会遇到如下问题,提示:"e:\ssc\software\ESP-IDF\v5.3.2\Espressif\tools\idf-python\3.11.2\python.exe -m pip" is not valid. (ERROR_INVALID_PIP)接着等待安装完成即可,其他步骤同方式1。

Freddy_Ssc的博客 4365

索引存储和哈希存储(散列存储)区别

首先看看课本的索引存储结构的解析 索引表里必须存关键字这一项,这就出现很大的冗余 但是散列存储(哈希存储)的区别特殊性:体现在它的关键码能确定数据元素的存储位置;还可以用来制作缓存,在没有redis等缓存手段的时代使用哈希存储结构来制作缓存的 看一条题目: 索引存储: 除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。 特点: 索引存储结构是用结点的索引号来确...

weixin_42765975的博客 1万+

24届-Python面经(华为OD)

【摘要】24届非科班生通过栗栗姐指导成功转行华为OD。从4月4日零基础准备,经历机考(4/18)、测评(4/19)、资格面(5/7)、技术面(5/9-11)到5月17日获offer。全程栗栗姐提供题库、面经指导和实时跟进。虽遇压力面和技术短板,但在专业辅导下10天走完全流程。案例证明转行需自身努力+优质HR支持,栗栗姐团队提供多岗位(Java/Python等)、多地域(北上深等)OD机会,含笔试资料和全流程攻略。

2401_86909848的博客 1188

Redis底层详解(一) 哈希表和字典

一文读懂哈希表

英雄哪里出来 33万+

【Ensp】FTP服务器设置和FTP解析

大部分的多媒体多媒体应用协议,如SIP,FTP,NetMeeting协议等,使用约定的固定端口来初始化一个控制连接,再动态地选择端口用于数据传输,并且这些端口选择是不可预测的。在防火墙设置时,可以通过ASPF(应用层报文过滤)中的Server Map表来满足多通道协议的正常工作,它正常检测应用层报文信息,并动态地根据报文内容创建和删除临时的Server Map表项,以允许其它非约定端口通过防火墙。(5)我们可以在路由器或能访问ftp服务器的设备上,通过cli命令行的方式来访问ftp服务器。

进击的小小白 1862

Proteus仿真——电压比较器

电压比较器是一种对输入信号进行鉴别与比较的电路,是组成非正弦波发生电路的基本单元电路。常用电压比较器有如下几种:单限比较器、滞回比较器、窗口比较器、集成电压比较器等。

weixin_58745307的博客 3376

Redis数据的键操作和hash操作

键 查找键,参数支持正则 KEYS pattern 判断键是否存在,如果存在返回1,不存在返回0 EXISTS key [key ...] 查看键对应的value的类型 TYPE key 删除键及对应的值 DEL key [key ...] 设置过期时间,以秒为单位 创建时没有设置过期时间则一直存在,直到使用使用DEL移除 EXPIRE key seconds 查...

baihai的博客 496

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

Coding... 2852

redis五种数据类型之hash(字典)

  前言:redis的hash(它是无需字典) 内部储存了很多键值对,实现结构上都是数组+链表的二维结构,不同的是,redis的字典的值只能是字符串,另外redis为了追求高性能,不能堵塞服务,所以采用了渐进式rehash的策略,有兴趣的朋友可以往这方面了解一下,下面我们来看看示例    设置hash:hset   字典名   值 &...

weixin_44320900的博客 561

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

weixin_74013772的博客 254

工业相机的检测原理课件(建议收藏)

本课件为各位工程师详细介绍了工业相机的视觉检测原理 ,旨在为工程师调试工业相机的视觉检测原理时提供理论性指导。

Bamboo265925的博客 498

Redis的list、hash、set、sorted_set

目录一、list二、hash三、set四、sorted_set 上一篇我们聊了Redis的String类型,我们都知道Redis有五大类型,除了String,还剩list、hash、set、sorted_set。同时,Redis命令的首字母很多都是和类型直接相关的,比如list中的 l ,一部分表示是list类型(除了表示left的 l )、hash的 h、set的 s,那为啥sorted_set就直接是 z 了呢,很简单,s 不是已经表示set了吗,Redis就直接取26个字母的最后一个 z来表示sort

Java和算法学习的博客 477

华为OD机试 - 幸运数字(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 3775

保存数组类型数据_Redis数据结构之字典

1、说明当我们使用 Redis 的 Hash 操作时,底层的实现就是字典。在介绍字典之后,我们先回忆一下 Redis 中的 Hash 操作。最常用的就是 HSET 和 HGET 了127.0.0.1:6379>HSETusernamesherlock(integer)1127.0.0.1:6379>HSETuserage20(integer)1127.0....

weixin_29502483的博客 509

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

想知道Redis字典结构的底层是如何实现的嘛

一、前言 文章很长,文末有福利 上节《闲扯Redis六》Redis五种数据类型之Hash型中说到 Hash(哈希对象)的底层实现有: 1、ziplist 编码的哈希对象使用压缩列表作为底层实现 2、hashtable 编码的哈希对象使用字典作为底层实现 原文解析 那么第二种方式中的字典究竟是怎样的一种结构呢? 字典, 又称符号表(symbol table)、关联数组(associative array)或者映射(map), 是一种用于保存键值对(key-value pa...

qq16680473763的博客 283

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

redis的字典(Hash)

字典(Hash) Redis的字典是使用HashTable作为底层实现,一个哈希表存储多个键值对节点。 字典结构 typedef struct dict { //类型特定函数 dictType *type; //私有数据 void *private; //哈希表 dictht ht[2]; //rehash索引 in trehashidx; //当没有进行rehash时,为-1 } dict; type是一个在指向dictType结

zihonggege的博客 974

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Redis数据结构四之字典和哈希表

字典在 Redis 中应用相当广泛,在介绍字典之前,先来介绍一下字典、哈希表、哈希表节点的几个概念。其中,的底层就是一个哈希表student 下的就是组成哈希表的各个哈希表节点对于 Redis,哈希表和哈希表节点两个数据结构就可以实现我们对 key-value 数据的操作,但是随着哈希表保存的键值对增加或者减少,我们就需要对哈希表进行扩展或者收缩操作,因此就额外引入了字典结构来做一些额外的辅助操作,具体的实现我们接下来介绍。

weixin_43354181的博客 432

《闲扯Redis七》Redis字典结构的底层实现

一、前言 上节**《闲扯Redis六》Redis五种数据类型之Hash型** 中说到 Hash(哈希对象)的底层实现有: 1、ziplist 编码的哈希对象使用压缩列表作为底层实现 2、hashtable 编码的哈希对象使用字典作为底层实现 原文解析 那么第二种方式中的字典究竟是怎样的一种结构呢? 疑问: 字典, 又称符号表(symbol table)、关联数组(associative array)或者映射(map), 是一种用于保存键值对(key-value pair)的抽象数据结构。在字典.

大道七哥 214

Redis之字典

一、概述 字典,又称为符号表(symbol table)、关联数组(associativearray)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。 在字典中,一个键(key)可以和一个值(value)进行关联(即键映射为值),这些关联的键和值就称为键值对。字典中的每个键都是独一无二的。 字典在Redis中的应用相当广泛,比如Redis的数据库就是使用字典来作为底层实现的,对数据库的增、删、查、改操作也是构建在对字典的操作之上的。...

sssxlxwbwz的博客 1482

Redis源码解析:03字典

字典是一种用于保存键值对(keyvalue pair)的抽象数据结构。在字典中,一个键和一个值进行关联,就是所谓的键值对。字典中的每个键都是独一无二的,可以根据键查找、更新值,或者删除整个键值对等等。         字典在Redis中的应用相当广泛,如Redis的数据库就是使用字典来作为底层实现的,对数据库的增、删、查、改操作也是构建在对字典的操作之上的。比如下面的命令: redis> SE

程序员的自我修养 1035

Redis的字典结构底层设计

相比前两种sds和list结构而言,字典的结构相对来说要复杂,主要涉及的都是和哈希相关的问题,包括但不限于哈希冲突的解决。哈希的扩容策略,哈希算法等。其主要用在redis的底层数据库底层实现,哈希键的底层实现。 ht属性是一个包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下,字典只使用ht[0]哈希表,ht[1]哈希表只会在对ht[0]哈希表进行rehash时使用。 ...

weixin_42331540的博客 216

Redis-3. 字典

Redis/字典字典的实现哈希表哈希表节点字典哈希算法解决键冲突rehash哈希表的扩展与收缩渐进式rehash字典API Redis对字典的使用相当广泛,例如Redis的数据库就是使用字典来作为底层实现的,对数据库的CRUD都是构建在字典的操作之上的。 除此之外,字典也是哈希键的底层实现之一。 当一个哈希键包含的键值对较多,又或者键值对中的元素都是比较长的元素时,Redis就会使用字典作为哈希键的底层实现。 Redis还有很多功能也使用到了字典,字典是Redis里面应用的特别广泛的一个数据结构 字典的实现

Loritas的小窝~ 338

Redis数据类型——字典

字典 字典, 又称为符号表(symbol table), 关联数组(associative array)或映射(map), 是一种用于保存键值对的抽象数据结构 字典中, 一个键(key)可以和一个值(value)进行关联, 并且每个键都是独一无二的, 程序可以在字典中根据键查找与之关联的值, 或者通过键来更新值, 或者根据键来删除整个键值对等 字典在Redis中的应用广泛,比如Redis的...

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 548

Redis底层数据结构——字典

在字典中,一个键 key 和一个值 value 进行关联,通过这样的关系,称他们为键值对。而字典的内部数据结构基本是由多个键值对组成的。 Redsi 使用 C 语言作为实现,但 C 语言不像其他大多语言把字典的数据结构内置,所以 Redis 实现了自己的专属字典结构。 字典应用场景 字典基本在 Redis 中是应用最广泛的,比如 Redis 的数据库就使用了字典作为了自己的底层实现,我们平时对数据库的增删改查都是建立在对字典的操作之上的。 还有 Redis 经常使用的数据类型:Hash , Zset 也都使

红橙呀 502

Redis-字典

字典用途 字典在 Redis 中的应用相当广泛, 比如 Redis 的数据库就是使用字典来作为底层实现的, 对数据库的增、删、查、改操作也是构建在对字典的操作之上的,除了用来表示数据库之外, 字典还是哈希键的底层实现之一: 当一个哈希键包含的键值对比较多, 又或者键值对中的元素都是比较长的字符串时, Redis 就会使用字典作为哈希键的底层实现。 字典的结构 Redis 字典所使用的哈希表由 di...

xiancaione的专栏 219

redis底层数据结构之字典(dict)

redis字典(dict)底层结构

junff 622
上一篇: android 导入数据库
下一篇: 我理解的mvc与springmvc
thecodeofsky
博客等级 码龄12年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值