快速整明白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结构中.当然,最直接的 ...
随机推荐
- windows doc命令复制粘贴文件
# 删除前端文件 rmdir /s/q E:\yuanbo2019\public\static del E:\yuanbo2019\public\index.html @echo off ::被复制的 ...
- JSP、Servlet和Spring MVC
感谢原博主!!!https://blog.csdn.net/whut2010hj/article/details/80874008 版权声明:本文为博主原创文章,遵循CC 4.0 BY版权协议,转载请 ...
- 设置程序启动时加载的storyboard
这个设置表明:程序启动时会加载Main.storyboard
- 什么是UILabel
UILabel极其常用,功能比较专一:显示文字 UILabel的常见属性 @property(nonatomic,copy) NSString *text; 显示的文字 @property(nonat ...
- Pandas常用操作 - 删除指定行/指定列
1. 删除指定行 new_df = df.drop(index='行索引') new_df = df.drop('行索引', axis='index') new_df = df.drop('行索引', ...
- Python语言编程基础
Python 技能目标 理解编程基本原理和思想 掌握python语言的基础语法 能够使用python进行基本的开发工作 熟练使用项目开发IDE:eclipse,PyDev 能够使用Python开发简单 ...
- HTTP缓存协议实战
一.什么是缓存 缓存,又称作Cache,我们把临时存储数据的地方叫做缓存池,缓存池里面放的数据就叫做缓存.当用户需要使用这些数据,首先在缓存中寻找,如果找到了则直接使用.如果找不到,则再去其他数据源中 ...
- SpringMVC 解析(三) Controller 注解
我在前面的文章中介绍了Spring MVC最核心的组件DispatcherServlet,DispatcherServlet把Servlet容器(如Tomcat)中的请求和Spring中的组件联系到一 ...
- Solution -「CF 793G」Oleg and Chess
\(\mathcal{Description}\) Link. 给一个 \(n\times n\) 的棋盘,其中 \(q\) 个互不重叠的子矩阵被禁止放棋.问最多能放多少个互不能攻击的车. ...
- [LeetCode]4.寻找两个正序数组的中位数(Java)
原题地址: median-of-two-sorted-arrays 题目描述: 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1, ...