redis源码之:字典dict

news2024/11/26 17:43:14

先来看看dict的大致结构:
在这里插入图片描述
debug所用demo如下:

void testDict();
int main(int argc, char **argv) {
    testDict();
}
void testDict(){
    dict *dict0 = dictCreate(&hashDictType, NULL);
    //注意key要用sds,如果是普通字符串,长度会判为0,然后所有的key比对都是异常的
    dictAdd(dict0,sdsnew("0001a"),"value");
    dictAdd(dict0,sdsnew("0001aa"),"value");
    dictAdd(dict0,sdsnew("0002a"),"value");
    dictAdd(dict0,sdsnew("0003a"),"value");
    dictAdd(dict0,sdsnew("0004a"),"value");
    dictAdd(dict0,sdsnew("0005a"),"value");
    dictAdd(dict0,sdsnew("0006a"),"value");
    dictAdd(dict0,sdsnew("0007a"),"value");
    dictAdd(dict0,sdsnew("0008a"),"value");
}

主要数据结构如下:

//整体的dict结构,可参考开头的图
typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];//包含两个,ht[1]在扩容rehash时使用
    long rehashidx; //值为-1,表示没有rehash,>=0时,表示已经rehash的table下标
    int16_t pauserehash;//
} dict;

//dict中ht[2]中元素的结构
typedef struct dictht {
    dictEntry **table;//table数组,每个table是一个链表,链表由若干dictEntry组成
    unsigned long size;//table数组大小
    unsigned long sizemask;//用来计算下标的掩码
    unsigned long used;//已经存储的元素dictEntry个数
} dictht;
typedef struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;//这个联合体中的这几个字段不知干嘛用的
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next;
}
dictEntry;

一、先来看下dicticreate()
在这里插入图片描述
二、添加元素dictAdd()
在这里插入图片描述

三、扩容_dictExpandIfNeeded()
在这里插入图片描述
四、rehash
在完成扩容后,并不是一下子就把原来ht[0]中每个table的链都直接迁移到新的扩容空间,而是通过一种渐进的方式,在下一次新增元素、或者查询、删除时,在方法一开始先进行一次rehash操作主键将ht[0]中的每个table链rehash,一次只处理一个下标的table链。
在这里插入图片描述
在这里插入图片描述
大致流程如下:
在这里插入图片描述
总体上,redis的字典,逻辑比java的hashmap还是简单很多的。

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

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

相关文章

这年头不会还有人纯文字聊天吧 ?教你用Python一键获取斗图表情包

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 很多兄弟在聊天上没有下太多的功夫,导致自己聊天的时候很容易尬住, 然后就不知道聊啥了,这时候合适表情包分分钟就能救场, 但是一看自己收藏的表情包,好家伙…

【MySQL】一文带你彻底了解事务机制

文章目录 何谓事务?事务的特性:ACID事务的操作隔离性引发的并发问题不可重复读和幻读有什么区别 事务的隔离级别MySQL 的隔离级别是基于锁实现的吗?默认隔离级别解决幻读的方法总结 我们设想一个场景,这个场景中我们需要插入多条相…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(下)

注意:本文由GPT4与Claude联合生成。 161、Secure Auctions in the Presence of Rational Adversaries 密封竞标拍卖用于在一组感兴趣的参与者之间分配资源。传统上,拍卖需要一个受信任的拍卖师在场,竞标者向其提供他们的私人出价。然而&#…

Flask简单入门

Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它使用 Werkzeug 作为底层 WSGI 实现,而 Jinja2 则是其默认模板引擎。Flask 的设计简单易用,灵活性高,可以快速构建出完整功能的 Web 应用。 本文将从 Flask 的基础知识介绍、开发环境…

基于SSD算法的电动车头盔检测【附代码】

本项目是基于SSD算法实现的电动车头盔检测。完整的项目是基于SSD的改进-->知识蒸馏-->自蒸馏-->剪枝-->trt推理。本想用来发论文的,但可能没那时间和精力了,这里仅选择项目中的一部分内容进行开源。 目录 开源说明 项目功能说明 项目代码…

尚硅谷微信小程序开发 仿网易云音乐App 小程序 后端接口服务器搭建

小程序学习 尚硅谷微信小程序开发 项目网易云小程序学习地址: 01-尚硅谷-小程序-课程介绍_哔哩哔哩_bilibili 视频相关的教程文档与笔记分享 链接:https://pan.baidu.com/s/1aq7ks8B3fJ1Wahge17YYUw?pwd7oqm 提取码:7oqm 配套服务器 老师…

还敢说你会接口测试吗?全覆盖接口测试扫描总结(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口的本质及其工…

搭建SpringBoot项目 详细教程

一、搭建SpringBoot项目 这个项目,可以作为种子项目,我打算把它放置Gitee上。包含大部分web开发的相关功能,后期所有的Spring Boot项目都可以用这个项目,简单修改一下配置,就可以快速开发了。 选择Spring initializr…

C51/C52--led流水灯、静态数码管

目录 一、led流水灯(flowing water lamp) 二、静态数码管 一、led流水灯(flowing water lamp) 我们在点亮一个led灯的基础上,对8个led灯按照某种特定的点亮规律进行操作,从而形成像水按顺序流动的效果。 …

缓存在高并发场景下的常见问题

缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓…

JMeter性能测试---完整入门到白了少年头

目录 一、性能测试 二、负载/压力/可靠性 三、JMeter工具 四、负载脚本 五、Jmeter参数化 六、远程操作运行脚本 一、性能测试 测试目的: 1.客户有明确要求,如:系统要求同时满足5000个用户登录,平均每个用户登录时间不能超…

体积小纯净无打扰,新版微软电脑管家在教国内做杀软

早在去年初,微软电脑管家就开启了 V1.0 版本内测,咱们也在第一时间替大伙儿体验了一番。 微软电脑管家最初就是专为国内用户推出的,算是真正做到了精简省心,无任何流氓广告弹窗行为。 这与咱们国内各种流氓杀软环境形成了极为鲜明…

IIS 7中添加匿名访问FTP站点

1. 开启FTP和IIS服务: 2.打开IIS 管理器: 我电脑上是IIS 7.5 ,所以选择第一个并点击打开哦。 如果你想知道自己IIS的版本,打开帮助菜单: 3. 新建FTP站点: 4. 填写站点基本信息: 5. 设置绑定和S…

Stable diffusion WebUI img2img使用教学

图生图 (img2img) 相较于文生图 (txt2img),因存在参考图片的基础上创作,其可控性自然更强。下面从图生图的几个应用方向出发,详述其功能特性。 文章目录 推提示词img 重新绘制参考图Resize mode 缩放模式Denoising 重绘幅度 Sketch 绘图Inpai…

集成光子芯片量子器件研究重要进展

前言: 中国科学技术大学郭光灿院士团队在集成光子芯片量子器件的研究中取得重要进展。该团队邹长铃、李明研究组提出人工合成光学非线性过程的通用方法,在集成芯片微腔中实验观测到高效率的合成高阶非线性过程,并展示了其在跨波段量子纠缠光源…

亚马逊云科技中国峰会“创业者之日”,赋能不同领域创业者前行

IDC预测,到2025年全球数据规模将达到175 ZB,这为人工智能模型训练提供了海量数据资源,全球AI产业迅速发展为创业者们带来了巨大的机遇,但也提出了全新的挑战。新的市场、高效的工具和智能的资源,开辟了创新的领域和商业…

23年互联网Java后端面试最全攻略,只花一周时间逼自己快速通关面试

大家从 Boss 直聘上或者其他招聘网站上都可以看到 Java 岗位众多,Java 岗位的招聘薪酬天差地别,人才要求也是五花八门。而很多 Java 工程师求职过程中,也是冷暖自知。很多时候技术有,但是面试的时候就是过不了! 为了帮…

JVM存储模型、值传递和引用传递

JVM存储模型、值传递和引用传递 一、首先根据下图理解一下JVM是什么? — Java程序和操作系统之间的桥梁 二、Java数据存储模型 因为栈区、本地方法栈、程序计数器是线程私有的,每一个线程在运行时会单独去创建这样一个内存,所以说有多少个线…

前端18K面试题总览,往这方面准备就对了

Vue面试题 生命周期函数面试题 1.什么是 vue 生命周期2.vue生命周期的作用是什么3.第一次页面加载会触发哪几个钩子4.简述每个周期具体适合哪些场景5.created和mounted的区别6.vue获取数据在哪个周期函数7.请详细说下你对vue生命周期的理解? vue路由面试题 1.mv…

Unity核心2——Sprite

顾名思义,Sprite Editor 就是精灵图片编辑器,它主要用于编辑 2D 游戏开发中使用的 Sprite 精灵图片 ​ 它可以用于编辑,图集中提取元素,设置精灵边框,设置九宫格,设置轴心(中心)点等…