redis源码之:字典dict

2023-10-26

先来看看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还是简单很多的。

五、dictScan
在这里插入图片描述
其中V的计算过程,我打算另外写一篇博客做简要分析,同时与JDK的hashmap的扩缩容做下比较
redis源码之:扩容后的dictScan遍历顺序与JDK的concurrentHashMap 扩容机制

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis源码之:字典dict 的相关文章

  • 连接到 localhost:6379 时出现错误 99。无法分配请求的地址

    设置 我有一个虚拟机 并在虚拟机中运行三个容器 一个 nginx 代理 一个非常简约的 Flask 应用程序和 redis Flask 应在端口 5000 上提供服务 而 redis 应在 6379 上提供服务 这些容器中的每一个都可以作为
  • 使用 EVAL、SCAN 和 DEL 的 Redis 通配符删除脚本返回“非确定性命令后不允许写入命令”

    因此 我正在寻求构建一个 lua 脚本 该脚本使用 SCAN 根据模式查找键并删除它们 原子地 我首先准备了以下脚本 local keys local done false local cursor 0 repeat local resul
  • 使用brew在MacOSx上安装Redis JSON

    如何使用brew 在 macOSx 上安装 RedisJSON 如何在不编译redis的情况下启用redis上的模块 我不想使用 docker 客户端 Redis Stack 可能是最简单的方法 它不仅仅是 RedisJSON 还包括 Re
  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • Node.js 上通过套接字连接 Redis

    由于共享托管 目标主机上的我的 redis 服务器不在端口上运行 而是在非常特定的套接字上运行 可以通过套接字文件连接到该套接字 只有我的用户可以访问 但是 我还没有找到如何通过套接字指定连接node redis and connect r
  • 保护节点 Redis

    我正在尝试保护 Node Redis IPC 服务器以使用私钥 公钥 我已经关注了本教程 http bencane com 2014 02 18 sending redis traffic through an ssl tunnel wit
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • 如何让客户端下载动态生成的非常大的文件

    我有一个导出功能 可以读取整个数据库并创建一个包含所有记录的 xls 文件 然后文件被发送到客户端 当然 导出完整数据库的时间需要大量时间 并且请求很快就会以超时错误结束 处理这种情况的最佳解决方案是什么 例如 我听说过使用 Redis 创
  • redis集群不断打印日志WSA_IO_PENDING

    当我启动redis集群的所有redis服务器时 所有这些服务器不断打印类似WSA IO PENDING clusterWriteDone的日志 9956 03 Feb 18 17 25 044 WSA IO PENDING writing
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • 库存管理系统的 SQL 与 NoSQL

    我正在开发一个基于 JAVA 的网络应用程序 主要目的是拥有在多个称为渠道的网站上销售的产品的库存 我们将担任所有这些渠道的管理者 我们需要的是 用于管理每个渠道的库存更新的队列 库存表 其中包含每个通道上分配的正确快照 将会话 ID 和其
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 从redis中检索大数据集

    一台服务器上的应用程序查询另一台服务器上运行的 Redis 查询的结果数据集约为 250kzrangebyscore objects locations inf inf这在应用程序服务器上似乎需要 40 秒 当使用命令执行时redis cl
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac

随机推荐

  • 音视频开发编程技术(一):视频编码格式

    1 视频是什么 所谓视频 其实就是将一张一张的图片连续的放出来 类似于播放放幻灯片一样 由于人眼的常规可视帧数是每秒24帧 也就是说当每秒播放的图片数量大于24张时 人眼反馈回大脑的画面就是连续的动作 所以 将多张图片保存下来并连续快速播放
  • 汇编程序设计与计算机体系结构,汇编程序设计与计算机体系结构:软件工程师教程...

    汇编程序设计与计算机体系结构 软件工程师教程 语音 编辑 锁定 讨论 上传视频 汇编程序设计与计算机体系结构 软件工程师教程 是2019年4月1日机械工业出版社出版的图书 作者是 美 布莱恩 R 霍尔 BrianR Hall 凯文 J 斯郎
  • Whitelabel Error Page

    启动springboot后 发现总是提示url路径错误 但是反复检查又发现好像没什么错误 注意 检查代码包是不是放在与application启动类同包下 因为springboot启动时会加载这个类同包的组件 不在一个包下就加载不了所以导致识
  • tcp短连接TIME_WAIT问题解决方法大全(1)——高屋建瓴

    tcp连接是网络编程中最基础的概念 基于不同的使用场景 我们一般区分为 长连接 和 短连接 长短连接的优点和缺点这里就不详细展开了 有心的同学直接去google查询 本文主要关注如何解决tcp短连接的TIME WAIT问题 短连接最大的优点
  • 【黑苹果教程】ELAN,FocalTech 以及 Synaptics 触控板驱动

    触控板上的手势操作应该是macOS的一大特色 但是黑苹果装完之后 很多人发现别说手势 很多基本的功能触控板都不能实现 此时你需要安装触控板驱动 本文参照osxlatitude论坛的ELAN FocalTech and Synaptics S
  • NMOS和PMOS详解以及电路设计

    一 简介 MOS管 是MOSFET的缩写 MOSFET金属 氧化物半导体场效应晶体管 简称金氧半场效晶体管 Metal Oxide Semiconductor Field Effect Transistor MOSFET 其中 G是栅极 S
  • apache 中 httpd.conf 的配置详解

    部分 1 全局环境 血泪提醒 rootDocument里面一定要有index php 或者index html 不然403错误 T T 本部分的表示将影响所有Apache的操作 例如 所能处理的并发请求数或配置文件地址 ServerType
  • Python拾遗2

    Python高级编程 第2版 1 常见的装饰器模式 参数检查 缓存 代理 上下文提供者 2 Python3新增函数注解 使用场景 类型检查 让IDE显示函数接受和返回的类型 函数重载 其他语言之间的桥梁 适配 谓词逻辑函数 数据库查询映射
  • python的输入与输出

    python输入 input 与输出 print 一 输入 input 在python3中 input会将接收到的用户输入自动存储为字符串类型 username input 输入用户名 cuihua print username cuihu
  • nlp-位置编码解析

    看到这里 是否记得前面提及Vaswani推出的Transformer结构 那么如果不使用RNN结构 是怎样表示位置信息的呢 在提信息位置技术前 先简介以下RNN和CNN RNN的序列结构不适合大规模并行训练 因为大家都知道 RNN对于序列问
  • matlab lstm工具箱,[转载]RNN以及LSTM的Matlab代码

    implementation of LSTM clc clear close all training dataset generation binary dim 8 largest number 2 binary dim 1 binary
  • LeetCode 667. 优美的排列 II

    题目链接 https leetcode cn problems beautiful arrangement ii C 代码如下 class Solution public vector
  • table元素无法固定列宽,width设置无效

    之前在做table的时候 因为不是用来做数据的展示的 所以对于具体的格式没有太高的要求 所以没有去深入了解 这次在做一个数据展示列表的时候使用table 因为假设每一个单元格数据是没有固定长度的 所以为了界面不会因为数据的变化格式发生大变化
  • okhttp报错:clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on jdk 9+

    一 问题现象 最近在用okHttp处理http请求调用 编写jmeter压测脚本时 出现一个奇怪的问题 idea中可以正常调用 但是打成jar包后 在jmeter中去使用时 则调不通 报错 clientBuilder sslSocketFa
  • JavaScript在小程序网页部署实战

    服务端推理和前端推理对比 前端推理趋势 落地场景 单模型 多模型 全链路流程 JS2 0介绍 核心指标 技术方案 模型转换 核心组件 初始化和预测 计算方案 模型安全处理 加密目标 方案介绍 方案流程 关键路径 性能优化 代码处理 视频获取
  • webpack基础

    webpack基础 设置webpack模式的几种方法 npx webpack mode development mode的优先级高于env npx webpack env development webpack config js modu
  • HTML加载本地图片

    img src img src 也可以注意图片名就是1 而不是1 jpg 自己要加上对应的图片类型 转载于 https blog 51cto com 13930723 2372776
  • 计算机基本组成原理(简要笔记)

    计算机体系 一 冯 诺依曼体系结构 从Linux 服务器开发视角来看计算机 都是符合冯 诺依曼体系结构的 1 1 4大部分 1 1 1 输入 输出设备 输入设备 向计算机输入数据 比如通过摄像头 MIC 将图像 声音等转成二进制数据给计算机
  • flutter 顶部状态栏透明

    flutter 顶部状态栏透明 main js文件 void main 顶部状态栏透明 SystemChrome setSystemUIOverlayStyle SystemUiOverlayStyle statusBarColor Col
  • redis源码之:字典dict

    先来看看dict的大致结构 debug所用demo如下 void testDict int main int argc char argv testDict void testDict dict dict0 dictCreate hashD