Redis笔记之基本数据结构 字典
字典
符号表、关联数组或者映射,有点类似于java中的map,用于保存键值对key-value。字典中的键key是独一无二的。底层实现为哈希表。下面进行简述:
- 哈希表。哈希表主要包含table数组、size、sizemask以及used。table用于保存哈希表节点,保存数据;sizemask为哈希表掩码用于计算索引;size用于保存table大小;used用于保存已经保存的节点数目,如图dictht结构体。
- 哈希表节点。用于保存key-value数据,以及next指针用于指向下一个节点,为了解决哈希冲突而采用的拉链法。
typedef struct dictEntry{void *key;union{void *val;uint64_t u64;int64_t s64;} v;struct dictEntry *next;
} dictEntry;
- 字典。主要包含type、privdata、ht[2]、rehashidx几个属性。type表示字典数据类型;privdata保存了需要传递给type指定类型函数的可选参数;ht[2]指向两个哈希表,一个用于平时保存数据,另一个用于rehash(扩容等)时使用;rehashidx在rehash使用,用于表示当前正在转移table中第几个索引的数据。整体结构茹下图。
哈希算法以及rehash
- 哈希算法。首先,计算key的哈希值然后使用掩码sizemask求得在table中的索引(例如, hash & sizemask),然后使用头插法直接插入,使用链地址法解决哈希冲突。
- rehash。当哈希表的负载因子过大或者过小时,需要进行扩展以及压缩,这个时候需要rehash,也就是需要重新计算当前值在新的table中的位置;扩展时,扩展为第一个大于等于ht[0].used*2的2的n次幂、压缩时,压缩为第一个大于等于ht[0].used的2的n次幂;负载因子等于used/size,当当前正在进行持久化时(BGSAVE或者BGREWRITEAOF),负载因子大于等于5扩展,平常选择1,当负载因子小于0.1时,进行压缩。rehash时,查询操作,先到ht[0]中查询,如果没有再去ht[1]中查询,插入新数据时,直接在ht[1]中插入。rehashidx默认为-1,当rehash时,保存的为正在转移的ht[0]中table的索引。
本文为《Redis设计与实现》阅读笔记
Redis笔记之基本数据结构 字典相关推荐
- Redis笔记之基本数据结构 链表
链表 链表具有空间存储不连续,增删节点快的优点,因此redis在列表键.发布与订阅.慢查询.监视器等使用了链表作为底层实现.由于C语言中没有内置的链表实现,因此redis自己进行了实现. 双向链表.每 ...
- Redis笔记之基本数据结构 动态字符串SDS
简单动态字符串 传统上的C语言的字符串表示是以空字符结尾的字符数组(C字符串),redis自己实现一个动态字符串(SDS),两者之间的区别以及使用SDS的好处有: 结构不同.C字符串以空字符结尾的字符 ...
- Redis 数据结构-字典源码分析
2019独角兽企业重金招聘Python工程师标准>>> 相关文章 Redis 初探-安装与使用 Redis 数据结构-字符串源码分析 本文将从以下几个方面介绍 前言 字典结构图 字典 ...
- Redis数据结构——字典-hashtable
字典简介: 字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构. 字典是一种用于保存键值对的抽象数据结构 ...
- 【《Redis深度历险》读书笔记(1)】基础:万丈高楼平地起 ——Redis 5种基础数据结构
[时间]2021.11.16 [题目][<Redis深度历险>读书笔记(1)]基础:万丈高楼平地起 --Redis 基础数据结构 本栏目是<Redis深度历险:核心原理和应用实践&g ...
- 【大厂面试】面试官看了赞不绝口的Redis笔记
文章目录 一.Redis简介 二.Redis API的使用和理解 (一)通用命令 (二)单线程架构 (三)数据结构和内部编码 (四)字符串 (五)hash (字典) (六)列表 (七)Set集合 (八 ...
- 狂神说Redis笔记
以下是狂神Redis笔记,个人觉得总结的很好,故收藏一下,日后再总结一下自己的笔记 ⭐学习时间2022.1.4-2022.1.6 一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90 ...
- 【redis】redis简介及基本数据结构的操作
一.简介 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提 ...
- Redis常用数据类型的数据结构
文章目录 1. Redis 数据库介绍 2. 列表(list) 3. 字典(hash) 4. 集合(set) 5. 有序集合(sortedset) 6. 数据结构持久化 7. 总结 1. Redis ...
最新文章
- memory align
- JUC多线程:Atomic原子类与CAS原理
- django request对象和HttpResponse对象
- airtest远程连接手机_远程连接路由器图文教程,查询无线wifi连接手机dhcp设备名列表...
- JAVA利用google的zxing解析二维码QRCODE
- Git工作笔记004---torisegit使用时Updates were rejected because the tip of your current branch i
- 浅谈最近公共祖先(LCA)
- MyBatis学习笔记(3)-动态SQL
- 超市管理系统连接服务器失败,超市管理系统应用解决超市管理难题
- 什么是搜索引擎分词技术?
- XXXXX was compiled with optimization - stepping may behave oddly; variables may not be available.
- DELL戴尔Win10双硬盘安装Ubuntu20.04双系统(附带ROS安装教程)
- opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)
- 不可重复读和幻读有什么区别?
- LVS+Keepalived之DR模式配置
- python给我做500份问卷
- 通过游戏学java(适合初学者)
- C#基础 Hashtable 修改键所对应的值
- Codevs 6个朋友
- EDI 855 采购订单确认