redis的hash实现

hash实现

redis的hash数据结构和java的HashMap虽然不同,但是有异曲同工之妙,value是键值对,相当于HashMap,对于hash碰撞也是采用的类似于HashMap的处理方式,数组+链表,更适合存储对象,将一个对象存储在hash类型中会占用更少的内存,且可以更方便的存取整个对象

编码格式

编码对象
OBJ_ENCODING_ZIPLIST使用ziplist
OBJ_ENCODING_HT使用的hash table

set有两种编码格式

  • ziplist 一开始存储使用的ziplist,但是当满足一定条件时会转换为hash table
  • hash table
#根据该配置项来进行编码转换的
# ziplist的节点数量限制
hash-max-ziplist-entries 512
# 键或者值的长度限制
hash-max-ziplist-value 64

源码结构

// 哈希表数据结构
typedef struct dict {
   // 类型
    dictType *type;
   // 私有数据,存储一些额外的数据
    void *privdata;
   // 哈希表
   // ht[0]:用来存放真是的数据
   // ht[1]:用于扩容/缩容
    dictht ht[2];
   // 哈希表重置下标,指定的是哈希数组的数组下标
   //rehash 如果为-1表示没有进行rehash,用来记录迁移的索引位置
    long rehashidx; /* rehashing not in progress if rehashidx == -1 */
   // 如果大于0,则暂停rehash
    int16_t pauserehash; /* If >0 rehashing is paused (<0 indicates coding error) */
} dict;

typedef struct dictht {
   // 哈希表数组,保存的是dictEntry结构的数据,就像HashMap中的Entry一样,存储的KV键值对
    dictEntry **table;
   // 哈希表大小
    unsigned long size;
   // 哈希表大小掩码,用于计算索引值
    unsigned long sizemask;
   // 哈希表已有节点数量
    unsigned long used;
} dictht;

typedef struct dictEntry {
   // 键
    void *key;
   // 值
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
   // 下一个哈希节点,链表,为了解决哈希冲突问题,形成链表
    struct dictEntry *next;
} dictEntry;

redis哈希冲突将新节点添加在链表的表头

过程分析

添加元素

向字典中添加元素,将会为字典中的ht[0]分配空间,默认情况下table数组为4(DICT_HT_INITIAL_SIZE),新添加元素的键值会经过哈希算法确定哈希表数组的位置,进行添加,如果两个不同的键经过哈希算法产生相同的哈希值,就会发生哈希冲突,采用链表的方式,新元素会放到链表头节点(与java7类似,因为新增加的节点,大概率会被再次访问)

扩容

扩容的时候会将ht[0]的所有键值都迁移到h[1]中,当节点全部迁移完毕后,释放ht[0]的占用空间,并将ht[1]设置为ht[0],由于redis中可能存的数据量比较大,所以进行rehash的时间可能会很长,而rehash又是一个阻塞的操作,所以redis采用的是渐进式的迁移方式,rehashidx就是为这个操作而设置的属性,用来记录索引位置的,默认为-1,当进行迁移的时候设置为0,每次接收到增加,删除,查找,更新命令时,除了执行该命令外,还需要将rehashidx索引上的节点迁移到ht[1],迁移之后,rehashidx+1,当所有的数据都迁移到ht[1]中时,rehashidx会被重新设置为-1

https://zhhll.icu/2021/数据库/非关系型数据库/redis/底层实现/5.hash实现/

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8-Seg改进:轻量化卷积设计 | DualConv双卷积魔改v8结构

🚀🚀🚀本文改进: DualConv双卷积魔改v8结构,达到轻量化的同时并能够实现小幅涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性能…

​【EI会议征稿中】#先投稿,先送审#第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)​

#先投稿&#xff0c;先送审# 第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 2024年3月1日-3日 | 中国南京 会议官网&#xff1a…

漏刻有时数据可视化Echarts组件开发(45)机场流程导航线和指示点的开发记录

路径线 ECharts中的路径线是指用于连接起点和终点的线。在ECharts中&#xff0c;路径图主要用于带有起点和终点信息的线数据的绘制&#xff0c;如地图上的航班、路线等。路径线可以用于展示数据点之间的连接关系&#xff0c;以及数据点之间的相对位置。 {//路径图name: 路线图…

Mr. Cappuccino的第65杯咖啡——MacOS安装Docker

MacOS安装Docker 下载Docker安装Docker查看Docker相关信息镜像加速 下载Docker Docker官网 Docker文档中心 Docker桌面版下载地址 安装Docker 查看Docker相关信息 docker --versiondocker info镜像加速 阿里云镜像加速器 "registry-mirrors": ["https://gq8…

【Mypy】超级实用的python高级库!

今天&#xff0c;我很兴奋地向大家介绍一个神奇的Python库&#xff1a;Mypy。这个库是Python世界中的一颗璀璨明星&#xff0c;提供了静态类型检查的强大功能&#xff0c;极大地增强了Python这门动态类型语言的健壮性和可维护性。我们将深入探索Mypy的多个方面&#xff0c;并通…

SpringBoot 源码解析2:启动流程1

SpringBoot 源码解析2&#xff1a;启动流程1 1.启动方式2.SpringBootApplication3.SpringApplication3.1 构造器SpringApplication3.2 SpringApplication#run 3.3 SpringApplication#run 中关键方法3.1 SpringApplication#prepareEnvironment3.2 SpringApplication#prepareCont…

BIM 技术:角色漫游

本心、输入输出、结果 文章目录 BIM 技术&#xff1a;角色漫游前言BIM角色漫游中&#xff0c;用户如何与建筑模型进行交互手势识别技术在BIM角色漫游中的应用有哪些图示花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准 BIM 技术&#xff1a;角色漫游 编辑&#xff1…

如何理解《注意力机制真的懂得“集中注意力”吗?》

在文章《从熵不变性看Attention的Scale操作》中&#xff0c;我们就从“集中注意力”的角度考察过Attention机制&#xff0c;当时我们以信息熵作为“集中程度”的度量&#xff0c;熵越低&#xff0c;表明Attention越有可能集中在某个token上。 但是&#xff0c;对于一般的Attent…

基于ssm金旗帜文化培训学校网站的设计与开发论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对培训学校展示信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

【云原生kubernets】Pod详解

一、Pod介绍 1.1.概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的State…

使用国内镜像源安装opencv

在控制台输入命令&#xff1a; pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 验证安装&#xff1a; step 1&#xff1a; 打开终端&#xff1b;step 2&#xff1a; 输入python&#xff0c;进入Python编译环境&#xff1b;step 3&#xff1a; 粘贴…

打开软木塞,我们来谈谈葡萄酒泡泡吧

香槟是任何庆祝场合的最佳搭配。从婚礼和生日到单身派对和典型的周五晚上&#xff0c;这款气泡饮料是生活中特别聚会的受欢迎伴侣。 来自云仓酒庄品牌雷盛红酒分享你知道吗&#xff0c;你喜欢喝的那瓶香槟酒可能根本不是香槟&#xff0c;而是汽酒&#xff1f;你不是唯一一个认…

面试官:你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢

一、什么是SPA SPA&#xff08;single-page application&#xff09;&#xff0c;翻译过来就是单页应用SPA是一种网络应用程序或网站的模型&#xff0c;它通过动态重写当前页面来与用户交互&#xff0c;这种方法避免了页面之间切换打断用户体验在单页应用中&#xff0c;所有必要…

系统安全-应用威胁风险检查项及预防方案

系统安全-应用威胁风险检查项及预防方案 1、欺骗&#xff08;认证&#xff09; 2、篡改&#xff08;授权和加密&#xff09; 3、抵赖&#xff08;日志记录和数字签名&#xff09; 4、信息泄露&#xff08;敏感信息保护&#xff09; 5、特权提升 6、拒绝服务&#xff08;数据稀释…

ubuntu安装详细步骤

一&#xff0c;先下载vmware 1&#xff0c;第一步打开上面链接 下载网址 : https://www.vmware.com/products/workstation-pro/wo rkstation-pro-evaluation.html 许可证 JU090-6039P-08409-8J0QH-2YR7F ZF3R0-FHED2-M80TY-8QYGC-NPKYF FC7D0-D1YDL-M8DXZ-CYPZE-P2AY6 ZC3T…

【SpringBoot篇】Interceptor拦截器 | 拦截器和过滤器的区别

文章目录 &#x1f339;概念⭐作用 &#x1f384;快速入门⭐入门案例代码实现 &#x1f6f8;拦截路径&#x1f354;拦截器interceptor和过滤器filter的区别&#x1f386;登录校验 &#x1f339;概念 拦截器&#xff08;Interceptor&#xff09;是一种软件设计模式&#xff0c;…

K8S学习指南(7)-k8s核心概念Annotation

文章目录 前言什么是注解&#xff1f;为什么使用注解&#xff1f;注解示例1. 文档化Pod的用途2. 集成监控工具3. 定义应用程序配置 结论 前言 Kubernetes&#xff08;常简称为K8s&#xff09;是一个强大的容器编排平台&#xff0c;已经成为现代应用开发和部署的基石。尽管在Ku…

唯创知音WTVxxx语音芯片在免洗烘干机中的应用:提升用户体验与产品智能化

在现今这个高科技普及的时代&#xff0c;人们对家电产品的需求不再仅仅满足于基本功能&#xff0c;而是更多的关注用户体验和产品智能化。因此&#xff0c;唯创知音WTVxxx语音芯片在免洗烘干机中的应用&#xff0c;无疑是对这一需求的完美回应。 唯创知音WTVxxx语音芯片是一款…

蓝桥杯专题-真题版含答案-【祖冲之割圆法】【错误票据】【显示为树形】【汉字相乘】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

【自定义Source、Sink】Flink自定义Source、Sink对ClickHouse进行读和批量写操作

ClickHouse官网文档 Flink 读取 ClickHouse 数据两种驱动 ClickHouse 官方提供Clickhouse JDBC.【建议使用】第3方提供的Clickhouse JDBC. ru.yandex.clickhouse.ClickHouseDriver ru.yandex.clickhouse.ClickHouseDriver.现在是没有维护 ClickHouse 官方提供Clickhouse JDBC…