当前位置:网站首页>快速整明白Redis中的字典到底是个啥
快速整明白Redis中的字典到底是个啥
2022-08-04 15:01:00 【51CTO】
字典简介
字典是一种用于保存键值对的数据结构,可以通过键值对中的键快速地查找到对应的值。在Redis所使用的C语言中,并没有内置字典,所以Redis自己实现了字典。
整个Redis数据库的所有的键和值就组成了一个全局的字典,对数据库的增删改查操作都是构建在字典的操作之上的。
字典还是Redis的基本数据类型哈希(hash)的底层实现之一,当哈希数据类型的键和值的长度较大或者键值对数量较多的时候,Redis就会把字典作为哈希数据类型的底层实现。
字典还是Redis的基本数据类型有序集合(zset)的底层实现之一,当有序集合中的所有元素的成员长度较长或者元素个数较多的时候,Redis就会把跳跃表和哈希表作为有序集合的内部实现。
字典的实现
在Redis中的字典是由dict
结构表示的,其底层实现使用了哈希表,一个哈希表包含多个哈希表结点,每一个哈希表结点都保存了字典中的一个键值对。下面我们一个一个地详细了解一下。
字典结构
字典是由dict
结构表示的,它包含以下几个属性:
type
属性:一个指向dictType
结构的指针,每个dictType
结构都保存了一套针对其特定类型键值对操作的函数。privdata
属性:保存了需要传给其特定类型函数的可选参数。ht
属性:一个包含两个项的数组,每一项都是一个哈希表。一般情况下,字典只使用第一个哈希表,只由在重新散列(rehash)的时候才会用到第二个哈希表。rehashidx
属性:用于记录重新散列(rehash)的进度,当没有重新散列(rehash)的时候,它的值为-1。
其中,type
属性和privdata
属性组合以后,就可以针对不同类型的键值对做不同的处理操作,比如:计算哈希值、复制键、复制值、对比键、销毁键、销毁值等等。
哈希表
哈希表使用dictht
结构表示,它包含以下几个属性:
table
属性:一个哈希表数组,数组中每个项都是指向哈希表结点的指针,每一个哈希表结点都保存了字典中的一个键值对。size
属性:哈希表的大小,也是就是哈希表数组(table
)的大小。sizemask
属性:哈希表大小掩码,用于计算索引值,一直等于哈希表大小(size
)-1。used
属性:哈希表中已有结点的数量。
哈希表结点
哈希表结点使用dictEntry
结构表示,它包含以下几个属性:
key
属性:用于保存键值对中的键。v
属性:用于保存键值对中的值。它可以是一个指针,也可以是一个uint64_t
的整数,也可以是一个int64_t
的整数。next
属性:一个指向下一个哈希表结点的指针。当发生键冲突的时候,它可以把多个哈希表结点连接起来,形成一个单向链表。
字典示例
说了这么多,都比较抽象不容易理解,我们来举个例子:
这就是一个字典的内部结构,其中有3个键值对,键分别是:万、猫、学社。
最后,谢谢你这么帅,还给我点赞和关注。
边栏推荐
- leetcode:251. 展开二维向量
- Next -18- 添加代码复制按钮
- F. Jinyu and its outer matrix (construction)
- leetcode: 255 Verify preorder traversal sequence binary search tree
- 兆骑科创创新创业大赛活动举办,线上直播路演,投融资对接
- IP第十六天笔记
- C# 局部函数与事件
- B.构造一个简单的数列(贪心)
- [Problem solving] QT update component appears "To continue this operation, at least one valid and enabled repository is required"
- [Beiya data recovery] IBM System Storage storage lvm information lost data recovery solution
猜你喜欢
关于pnpm包管理器的版本问题
【HMS core】【Media】【视频编辑服务】 在线素材无法展示,一直Loading状态或是网络异常
JCMsuite应用:倾斜平面波传播透过光阑的传输
Leetcode: 215 disorderly to find the first big k element in the array
[The Art of Hardware Architecture] Study Notes (1) The World of Metastability
【Web技术】1401- 图解 Canvas 入门
用了TCP协议,就一定不会丢包吗?
leetcode:259. 较小的三数之和
leetcode:250. 统计同值子树
Win10无法访问移动硬盘怎么解决
随机推荐
企业级优化
杭电校赛(ACM组队安排)
IP第十七天笔记
eNSP-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
B.构造一个简单的数列(贪心)
[深入研究4G/5G/6G专题-50]: URLLC-16-《3GPP URLLC相关协议、规范、技术原理深度解读》-10-高可靠性技术-1-低编码率编码调制方案MCS与高可靠性DRB
How to automatically renew the token after it expires?
编译型与解释型编程语言的区别
集合划分差最小问题(01背包)
RS|哨兵二号(.SAFE格式)转tif格式
【北亚数据恢复】IBM System Storage存储lvm信息丢失数据恢复方案
技术分享| 融合调度系统中的电子围栏功能说明
杭电校赛(逆袭指数)
leetcode: 251. Expanding 2D Vectors
郑轻新生校赛和中工选拔赛题解
License server system does not support this version of this feature
leetcode: 241. Designing precedence for arithmetic expressions
16、学习MySQL 正则表达式
Redis 高可用
FRED Application: Capillary Electrophoresis System