快速整明白Redis中的字典到底是个啥
字典简介
字典是一种用于保存键值对的数据结构,可以通过键值对中的键快速地查找到对应的值。在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个键值对,键分别是:万、猫、学社。
最后,谢谢你这么帅,还给我点赞和关注。
微信公众号:万猫学社
微信扫描二维码
关注后回复「电子书」
获取12本Java必读技术书籍

快速整明白Redis中的字典到底是个啥的更多相关文章
- 快速整明白Redis中的整数集合到底是个啥
整数集合简介 整数集合(intset)是Redis集合数据类型的内部编码之一,当集合数据类型中的元素都是整数并且元素数量较少的时候,Redis就使用整数集合作为内部编码. 整数集合(intset)中可 ...
- 快速整透Redis中的压缩列表到底是个啥
压缩列表简介 压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构.一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值.它是Redis为了节省内存空间而开发的. 压缩列 ...
- redis中的字典结构是怎样的?
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 基础概念 redis支持的5种数据类型中,有hash类型,hash类型的 ...
- Redis数据结构详解(2)-redis中的字典dict
前提知识 字典,又被称为符号表(symbol table)或映射(map),其实简单地可以理解为键值对key-value. 比如Java的常见集合类HashMap,就是用来存储键值对的. 字典中的键( ...
- 一文彻底明白linux中的selinux到底是什么
https://www.phpyuan.com/235739.html 一.前言 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内 ...
- linux中的selinux到底是什么
一文彻底明白linux中的selinux到底是什么 2018年06月29日 14:17:30 yanjun821126 阅读数 58877 标签: SElinux 更多 个人分类: Linux 一 ...
- Redis 中的 set 和 sorted set 如何使用,源码实现分析
set 和 sorted set 前言 set 常见命令 set 的使用场景 看下源码实现 insert dict sorted set 常见的命令 使用场景 分析下源码实现 ZADD ZRANGE ...
- Redis实现之字典
字典 字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构.在字典中,一个 ...
- 快速同步mysql数据到redis中
MYSQL快速同步数据到Redis 举例场景:存储游戏玩家的任务数据,游戏服务器启动时将mysql中玩家的数据同步到redis中. 从MySQL中将数据导入到Redis的Hash结构中.当然,最直接的 ...
随机推荐
- 如何使用C++开发PHP扩展(下)
更多的情况是业务中已经有独立的 api 库,形式为 libxxx.a / libxxx.so,PHP程序中需要调用这些 api,所以这时就要编写PHP扩展来实现.这时是使用静态库 libxxx.a , ...
- homestead 入坑安装
1.在使用 Homestead 之前,需要先安装 Virtual Box.VMWare.Parallels 或 Hyper-V (四选一,我们通常选择 VirtualBox,因为只有它是免费的)以及 ...
- Linux Shell中的数组及遍历 转
转自:http://www.linuxidc.com/Linux/2011-09/42929.htm 在Linux下使用shell的时候,为方便起见,偶尔会用到一下数组.数组的申明方式是: array ...
- opencv笔记--Active contours
Active Contours 也称作 Snake,通过定义封闭区域曲线的能量函数,并使其最小化得到最终曲线. Active Contours 被用作物体边界精确定位上,opencv 给出了一个实现, ...
- 布尔值与比较运算符"=="
$man = "男";$flag = $man == "男"; //双等号是比较运算符,返回布尔值,成立则返1赋给$flag 不成立返回0,0即为nullech ...
- SpringMVC的web配置
之前并没有意愿写关于下面内容的小作文.因为总结SPI相关的标准(SPI机制之JDK中的SPI - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)),而这个也是关于标准的,Servlet3.0 ...
- 通过JAVA对FTP服务器连接,上传,下载,读取,移动文件等
记录一次对FTP服务器文件内容 通过Java程序对FTP服务器文件处理:连接,上传,下载,读取,移动文件等. 需求描述:今天接到一个任务,在Java项目中,读取FTP服务器上的一些文件,进行一些业务操 ...
- The POM for com.alibaba:druid:jar:1.2.6 is invalid, transitive dependencies (if any) will not be available
开发环境 IDEA2020.3, jdk1.8.0_231 问题描述 开发中引入了druid-spring-boot-starter最新版本1.2.6,项目install时的时候一直出现警告 The ...
- 简述LSM-Tree
LSM-Tree 1. 什么是LSM-Tree LSM-Tree 即 Log Structrued Merge Tree,这是一种分层有序,硬盘友好的数据结构.核心思想是利用磁盘顺序写性能远高于随机写 ...
- IDEA tomcat启动报错----Artifact is being deployed, please wait...解决
今天学习遇到了这个错误,记录下自己遇到的错误和解决方法! 这个报错的意思是: Artifact 正在部署中,请稍候- 实际上有可能就是jar包没有导进去.检查项目打包情况:file-->Proj ...