字典

符号表、关联数组或者映射,有点类似于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笔记之基本数据结构 字典相关推荐

  1. Redis笔记之基本数据结构 链表

    链表 链表具有空间存储不连续,增删节点快的优点,因此redis在列表键.发布与订阅.慢查询.监视器等使用了链表作为底层实现.由于C语言中没有内置的链表实现,因此redis自己进行了实现. 双向链表.每 ...

  2. Redis笔记之基本数据结构 动态字符串SDS

    简单动态字符串 传统上的C语言的字符串表示是以空字符结尾的字符数组(C字符串),redis自己实现一个动态字符串(SDS),两者之间的区别以及使用SDS的好处有: 结构不同.C字符串以空字符结尾的字符 ...

  3. Redis 数据结构-字典源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 相关文章 Redis 初探-安装与使用 Redis 数据结构-字符串源码分析 本文将从以下几个方面介绍 前言 字典结构图 字典 ...

  4. Redis数据结构——字典-hashtable

    字典简介: 字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构. 字典是一种用于保存键值对的抽象数据结构 ...

  5. 【《Redis深度历险》读书笔记(1)】基础:万丈高楼平地起 ——Redis 5种基础数据结构

    [时间]2021.11.16 [题目][<Redis深度历险>读书笔记(1)]基础:万丈高楼平地起 --Redis 基础数据结构 本栏目是<Redis深度历险:核心原理和应用实践&g ...

  6. 【大厂面试】面试官看了赞不绝口的Redis笔记

    文章目录 一.Redis简介 二.Redis API的使用和理解 (一)通用命令 (二)单线程架构 (三)数据结构和内部编码 (四)字符串 (五)hash (字典) (六)列表 (七)Set集合 (八 ...

  7. 狂神说Redis笔记

    以下是狂神Redis笔记,个人觉得总结的很好,故收藏一下,日后再总结一下自己的笔记 ⭐学习时间2022.1.4-2022.1.6 一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90 ...

  8. 【redis】redis简介及基本数据结构的操作

    一.简介 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提 ...

  9. Redis常用数据类型的数据结构

    文章目录 1. Redis 数据库介绍 2. 列表(list) 3. 字典(hash) 4. 集合(set) 5. 有序集合(sortedset) 6. 数据结构持久化 7. 总结 1. Redis ...

最新文章

  1. memory align
  2. JUC多线程:Atomic原子类与CAS原理
  3. django request对象和HttpResponse对象
  4. airtest远程连接手机_远程连接路由器图文教程,查询无线wifi连接手机dhcp设备名列表...
  5. JAVA利用google的zxing解析二维码QRCODE
  6. Git工作笔记004---torisegit使用时Updates were rejected because the tip of your current branch i
  7. 浅谈最近公共祖先(LCA)
  8. MyBatis学习笔记(3)-动态SQL
  9. 超市管理系统连接服务器失败,超市管理系统应用解决超市管理难题
  10. 什么是搜索引擎分词技术?
  11. XXXXX was compiled with optimization - stepping may behave oddly; variables may not be available.
  12. DELL戴尔Win10双硬盘安装Ubuntu20.04双系统(附带ROS安装教程)
  13. opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)
  14. 不可重复读和幻读有什么区别?
  15. LVS+Keepalived之DR模式配置
  16. python给我做500份问卷
  17. 通过游戏学java(适合初学者)
  18. C#基础 Hashtable 修改键所对应的值
  19. Codevs 6个朋友
  20. EDI 855 采购订单确认

热门文章

  1. 用离线编辑器Zoundry写zblog日志
  2. Python语法特点如注释规则、代码缩进、编码规范等
  3. 使用Prometheus监控Cloudflare的全球网络
  4. MySQL5.6 新特性之GTID【转】
  5. data.frame类型数据如何将第一列值替换为行号
  6. Microsoft.AspNet.Identity 自定义使用现有的表—登录实现
  7. mac地址漂移flapping的前因后果
  8. 全局变量局部变量ScriptCase中的全局变量、局部变量
  9. Cisco 3560 Qos限速配置
  10. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用33