Redis中的hashtable底层数据结构

redis底层数据结构(三)-Hash底层结构:listpack、ziplist、hashtable 更多内容请关注微信公众号: Java晋升。 阅读详情

制图工具:GitHub网站      (如果觉得我的图还行,直接用我的也可以)

Redis整体结构(Redis server v=4.0.12 ,Redis服务器版本为4.0.12)

 源码: server.h

typedef struct redisDb {
    dict *dict;                 /* The keyspace for this DB */
    dict *expires;              /* Timeout of keys with a timeout set */
    dict *blocking_keys;        /* Keys with clients waiting for data (BLPOP)*/
    dict *ready_keys;           /* Blocked keys that received a PUSH */
    dict *watched_keys;         /* WATCHED keys for MULTI/EXEC CAS */
    int id;                     /* Database ID */
    long long avg_ttl;          /* Average TTL, just for stats */
} redisDb;

  *dict:字典结构 

 *expire: 过期时间设置

 *blocking_keys:阻塞命令

  *ready_keys:

  *watched_keys

 id: 数据库编号

  avg_ttl:平均ttl

 

  字典结构:dict.h 

typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];
    long rehashidx; /* rehashing not in progress if rehashidx == -1 */
    unsigned long iterators; /* number of iterators currently running */
} dict;

  *type : 

  * privdata:私有数据

  dictht  ht[2]  : hashtable,  为什么数组长度为2: 另一个使用来进行hashtable扩容的

  rehashidx:重哈希

   iterators: 

typedef struct dictType {
    uint64_t (*hashFunction)(const void *key);
    void *(*keyDup)(void *privdata, const void *key);
    void *(*valDup)(void *privdata, const void *obj);
    int (*keyCompare)(void *privdata, const void *key1, const void *key2);
    void (*keyDestructor)(void *privdata, void *key);
    void (*valDestructor)(void *privdata, void *obj);
} dictType;
typedef struct dictht {
    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;

key : redisObject 

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;
    void *ptr;
} robj;

type : 区分类型,string,list,hash,set, sorted  set

encoding:数据编码,包括embstr, int, raw

Lru: 内存淘汰

refcount: 内存管理的

*ptr :真实数据存储

总体示意图:

 

 

Ziplist(压缩列表)

 

示意图:

  • 属性介绍:

  zlbytes:  32bit,表示ziplist占用字节的总数
  zltail:   32bit,表示ziplist表中最后一项(entry)在ziplist中的偏移字节数,通过zltail可以很方便地找到最后一项,从而可以在   ziplist尾端快速地执行push或pop操作
  zlen:   16bit,表示ziplist中数据项(entry)的个数
 prerawlen:前一个entry的数据长度
 len:   entry中的数据长度
 data:  真实数据的存储

特点:

  • ziplist是为节省内存空间而生的【紧凑型】。
  • ziplist是一个为Redis专门提供的底层数据结构之一,本身可以有序也可以无序。当作为list和hash的底层实现时,节点之间没有顺序;当作为zset的底层实现时,节点之间会按照大小顺序排列。

 quicklist(快速列表)

源码:  quicklist.h

typedef struct quicklist {
    quicklistNode *head;
    quicklistNode *tail;
    unsigned long count;        /* total count of all entries in all ziplists */
    unsigned long len;          /* number of quicklistNodes */
    int fill : 16;              /* fill factor for individual nodes */
    unsigned int compress : 16; /* depth of end nodes not to compress;0=off */
} quicklist;
typedef struct quicklistNode {
    struct quicklistNode *prev;
    struct quicklistNode *next;
    unsigned char *zl;
    unsigned int sz;             /* ziplist size in bytes */
    unsigned int count : 16;     /* count of items in ziplist */
    unsigned int encoding : 2;   /* RAW==1 or LZF==2 */
    unsigned int container : 2;  /* NONE==1 or ZIPLIST==2 */
    unsigned int recompress : 1; /* was this node previous compressed? */
    unsigned int attempted_compress : 1; /* node can't compress; too small */
    unsigned int extra : 10; /* more bits to steal for future usage */
} quicklistNode;

示意图:

 属性介绍:

   head: 头结点

  tail:尾结点

 count:ziplist中的entry节点的个数

 len: quicknode的个数

 prev:前一个节点的指针

 next:下一个节点的指针

 

VSCode配置C/C++开发环境:从零安装MinGW-w64并运行第一个C程序 在Windows系统上搭建C语言开发环境时,很多初学者混淆编辑器、编译器与调试器的分工,导致配置过程屡屡受挫。理解VSCode作为轻量级编辑器的定位,以及MinGW-w64提供的gcc编译器在源码编译中的核心作用,是顺利完成环境配置的关键。环境变量的正确设置直接影响gcc命令能否全局调用,而C/C++插件则赋予编辑器语法高亮与智能提示能力。通过安装VSCode、配置MinGW-w64、安装插件、汉化界面并运行一个最简单的hello.c程序,就能系统掌握这套开源工具链的完整工作流。无论是用于课程学习、算法练习 阅读详情

相关推荐

2025年12月11日 Coherent收发器下沉到数据中心:调研

技术可行性已基本具备。随着3nm DSP技术的成熟和Coherent-Lite等低功耗方案的推出,Coherent技术与IMDD的功耗差距在800G及以上速率节点快速缩小。特别是在1.6T及更高速率,两种技术的功耗开始趋于收敛。同时,通过系统级优化,如将DSP功能从可插拔模块转移到ASIC芯片,可实现30%以上的功耗降低。在成本方面,硅光技术的进步使得单通道硅光引擎BOM成本降至18美元,较2020年下降62%,逼近InP方案的经济临界点。光学系统机会丰富多样。

weixin_51184047的博客 1167

一文带你深入理解Hashtable

HashTable底层的实现机制是什么?HashTable的扩容机制是什么?HashTable和HashMap的区别是什么?存储key-value键值对格式是无序的底层通过数组+链表的方式实现通过synchronized关键字实现线程安全key、value都不可以为null(为null时将抛出NullPointerException)实现了Map接口,提供了键值对增删改查等基础操作继承了Dictionary字典类,Dictionary是声明了操作"键值对"函数接口的抽象类。

weixin_49307478的博客 1149

CPU系统级验证——测试激励——imperas公司riscvOVPsimPlus文件分析

本分析重点关注该repo向量扩展部分。 1. repo简介 该repo是指令集验证的仿真环境包括,大部分是指令集的测试用例,也包含了一些模拟器,如riscvOVPsimPlus。 主要介绍的是riscvOVPsimPlus指令集模拟器,riscvOVPsimPlus(下面统称ISS)是imperas公司在riscvOVPsim基础上扩充了向量扩展的指令集模拟器,该repo于今年9月份部分开源 什么叫部分开源呢? 首先该repo必须在imperas官网注册下载,而且必须是企业用户(免费邮箱人家瞧不上.

知识,既贵,又便宜。 4459

java hashtable 数据结构_java Hashtable底层原理是怎样的?数据结构包括什么?

大家都知道,随着近些年科学技术水平的不断进步与发展,学习编程语言的人也越来越多了。很多人对于java中的一些常见知识点有些不了解,今天就来为大家详细介绍一下。首先说一下具体的概念:HashTable类继承自Dictionary类, 实现了Map接口。 大部分的操作都是通过synchronized锁保护的,是线程安全的,key、value都不可以为null, 每次put方法不允许null值,如果发现...

weixin_35381903的博客 4863

别再死记硬背参数了!用ADS手把手教你仿真一个4GHz镜像抑制混频器(附完整工程文件)

本文详细解析了4GHz镜像抑制混频器的ADS仿真全流程,从理论到实践,涵盖混频器设计基础、ADS工程搭建、二极管选型、非线性仿真及性能优化。通过实战案例,帮助工程师掌握关键参数平衡与调试技巧,提升射频电路设计效率。

weixin_42552716的博客 339

2025高教社数学建模国赛A题 - 烟幕干扰弹的投放策略(完整参考论文)

摘要:本研究基于模拟遗传退火算法优化无人机投放烟幕弹策略,建立三维运动学模型分析遮蔽效果。针对不同战术场景(单机单弹至多机多弹),构建以遮蔽时间最大化为目标的非线性优化模型。通过改进遗传算法求解最优参数组合,结果显示在给定条件下单枚烟幕弹对M1导弹的有效遮蔽时长可达1.4秒。研究为无人机协同干扰提供了高效解决方案,验证了智能算法在复杂战术决策中的适用性。关键词:烟幕干扰;无人机投弹;运动学建模;时序优化;遗传算法。

ProminentWu的博客 544

简述哈希表

哈希表的简述 如何判断哈希表的新增过程.....

weixin_52515164的博客 2233

YOLOv8 更换损失函数DIoU、EIoU、GIoU...Inner-IoU...

介绍了一些损失函数,并将其应用到yolov8训练中

分享一些自己改进代码的实例 888

【数据结构与算法篇】 哈希表原理、底层实现剖析

哈希表,哈希表原理,hash函数,散列函数,hash底层实现;

m0_64231944的博客 3403

【嘉立创EDA】PCB金属包边设计快捷方法

本文使用嘉立创EDA,描述如何在PCB设计时,快速增加边框包边设计,特别是金属包边(伪)——这里标记(伪)是因为该这里的包边特指不含边缘壁。请参考本文时特别注意!本文将此过程记录,以供有需要的读者参考。

l64481000的博客 1741

数据分片的三种方式:哈希、一致性哈希、按照数据范围分片

数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。三种常用的数据分片方式:1. 哈希分片2. 一致性哈希分片(Consistent Hash)3. 按照数据范围分片(Range Based)数据分片的应用场景:1. 数据库扩展2. 分布式缓存对集群部署多个缓存节点,提高缓存的处理能力。

wjianwei666的专栏 1135

关于HashTable

HashTable 通过简单的同步机制实现线程安全,但因锁粒度过大、性能低下,已不适用于高并发场景。HashTable 是 Java 早期提供的线程安全的键值对存储结构,基于哈希表实现。:元素数量 ≥ 阈值(阈值 = 容量 × 负载因子,默认负载因子 0.75)。数组的每个元素称为“桶”(Bucket),存储链表的头节点。:锁住整个 HashTable 实例,高并发场景下性能较差。:素数作为容量可降低哈希冲突概率(哈希值取模时分布更均匀)。新容量 = 旧容量 × 2 + 1(保持容量为素数)。

looken1024的博客 820

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Redis底层结构(五)-Set对应数据结构(listpack、hashtable、intset)

set底层会有intset,listpack,hashtable这三种数据类型,listpack和hashtable在其他文章已经介绍了,这里就不再赘述了。intset,其实是一种比较简单的数据结构。当 Set 中的元素满足特定条件时,Redis 会自动使用 intset 编码以节省内存并提高性能。intset(整数集合)是 Redis 中 Set 类型的一种高效存储结构,专门用于存储。

Java晋升 366

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

4、Redis7底层数据结构解析

我们已经知道了Redis有上层的应用类型,也有底层的数据结构。那么这些上层数据类型和底层数据结构是怎么对应的呢?OKstring"embstr"这就是一种对应关系。也就是说,在应用层面,我们操作的是string这样的数据类型,但是Redis在底层,操作的是embstr这样一种数据结构。但是,这些上层的数据类型和底层的数据结构之间,是不是就是简单的一一对应的关系呢?

输入知识,消化知识,输出知识,分享知识,教人让我学习更好,业精于勤荒于嬉,行成于思毁于随 1527

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Redis数据结构之Hash

Redis哈希类型是存储键值对集合的高效数据结构,适用于存储对象信息、会话数据等场景。其底层实现经历了多次优化:Redis 6及之前版本使用压缩列表(ZipList)和哈希表(HashTable),7.0版本后引入紧凑列表(ListPack)完全替代ZipList,解决了连锁更新问题。QuickList作为ZipList和链表的混合体,在中间版本中用于平衡性能。哈希表通过dictEntry实现键值存储,采用渐进式rehash机制保证扩容时的性能。常用命令包括HSET、HGET、HINCRBY等,支持字段级操

chengxuyuan_2012的专栏 1175

【redis前传】为什么set底层hashtable+intset两种数据结构 | 超出长度升级解决

redis的整数集是什么?当我们想set集合中添加整数时内部又是什么结构?整数集默认是多少范围?超出了范围的数据是如何存储的?删除最长元素后会不会发生降级的变化? 今天,我们就来对整数集一探究竟 为什么整数集升级后不能在进行降级操作 | intset位升级频率 前言 整数集合相信有的同学没有听说过,因为redis对外提供的只有封装的五大对象!而我们本系列主旨是学习redis内部结构。内部结构是redis五大结构重要支撑! 前面我们分别从redis内部结构分析了redis的List...

瑾的日常 633

Redis进阶:图文讲解Redis底层数据结构之embstr,raw,ziplist,quicklist和hashtable (带源码讲解)

(1)基础数据类型是显式类型,不同的值属性会映射不同的Redis对象; (2)embstr和raw存储字符串,embstr分配一次内存,raw分配两次内存,性能较raw好; (3)ziplist压缩列表节省内存空间,但是会有级联更新的问题; (4)quicklist组合双向链表和压缩列表,高效插入、删除,连续的存储空间,访问效率高; (5)hashtable渐进式rehash,效率较一次rehash高,并且hashFunction(key)较string节约内存空间。......

天然玩家的博客 3531

Redis的底层数据结构----字典_dict(hashtable)

字典一. Redis字典结构①. 字典结构图②. 字典dict③. 散列表dictht③. 散列表节点dictEntry二. Redis解决散列冲突①. 链表法②. Redis rehash 一. Redis字典结构 Redis字典使用散列表最为底层实现,一个散列表里面有多个散列表节点,每个散列表节点就保存了字典中的一个键值对。 ①. 字典结构图 ②. 字典dict typedef struct dict{ //类型特定函数 void *type;

800

Redis常用数据类型底层实现

Redis 凭借其高性能、丰富的数据结构和灵活的使用场景,早已成为后端开发者的“标配”技能。尤其在高并发系统中,Redis 常被用作缓存、消息队列、分布式锁等核心组件。本文将剖析 Redis 五种核心数据类型的底层数据结构。

Leng_Ming993的博客 1116

redis的五种数据结构原理分析

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs和 地理空间(geospatial) 索引半径查询。 简单来说,Redis的数据结构主要分为五种基本的数据结构+三种高级的数据结构。我们下面所要介绍的就是这五种基本的数据...

bobozai86的博客 776

存储类型_HFL Redis_09_hash类型底层存储数据结构

HotFrameLearning(简称 HFL) Redis_09_hash类型底层存储数据结构-一、大致介绍```1、上一篇讲解了list的底层数据结构,这节我们继续讲hash数据结构;2、接下来我就通过参考 redis-6.0.6 源码给大家介绍下hash的底层数据结构吧;```二、hash数据结构2.1 源码详解(hsetCommand)图1 - hsetCommand方法图2 - hash...

weixin_42386504的博客 301

Redis(十八)——底层数据结构(三)

Redis底层数据结构解析:IntSet和RadixTree IntSet是Redis用于存储整数集合的紧凑结构,采用有序数组实现,支持二分查找(O(logn)),内存占用低但插入/删除需移动元素(O(n))。当元素超限或含非整数时自动转为哈希表。 RadixTree(基数树)是Redis 5.0+用于Stream类型的高效字符串存储结构,通过压缩单子节点路径优化普通前缀树,节省空间同时保持快速查找特性。 两种结构分别针对整数集合和字符串集合场景优化,体现了Redis根据不同数据类型特点选择最优底层实现的策

Java球球憋卷啦🥵 732

Redis数据结构之Set

Redis的Set类型是一种无序且唯一的数据集合,底层采用IntSet和HashTable两种结构存储。当元素均为整数且不超过512个时使用IntSet,否则转为HashTable。Set支持O(1)复杂度的增删查操作,以及交集、并集、差集等运算,适用于去重、标签管理、随机抽奖等场景。其核心特性包括自动去重、快速查找和高效集合运算,通过SADD、SMEMBERS、SINTER等命令实现丰富的数据操作功能,是Redis中处理唯一性数据的重要数据结构。

chengxuyuan_2012的专栏 1201

hashtable允许null键和值吗_Redis 常见对象类型的底层数据结构,你都了解吗?

转自:伍陆七,链接:cnblogs.com/chentianming/p/13838347.htmRedis 是一个基于内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis 支持五种常见对象类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Zset),我们在日常工作中也会经常使用它们。知其然,更要知其所以然,本文将会带你读懂这...

weixin_39781186的博客 476

Redis数据结构中ZipList与HashTable的动态选择与内存管理策略

Redis通过动态选择ziplist和hashtable作为Hash数据结构的底层实现,结合高效的内存回收机制和HashTable优化策略,灵活应对不同场景下的数据存储和访问需求。这种策略提高了Redis的存储效率和操作性能,降低了内存碎片和内存管理复杂性。随着Redis应用场景的拓展和数据量的增长,对内存管理策略的优化将变得更为重要,以进一步提升Redis的性能和稳定性。

技术铺掌柜 1305

深入剖析Redis常用数据结构

Redis数据结构的底层实现,始终围绕“性能优先、内存优化”的核心思想,总结为3点:分层设计:对外提供简洁的逻辑类型接口,对内根据数据特征动态选择最优底层编码,兼顾易用性与性能。动态适配:同一逻辑类型在不同数据量、数据类型下,自动切换底层编码(如Hash的listpack→hashtable),平衡内存与效率。极致优化:针对不同场景设计专属结构(如SDS解决C字符串缺陷、quicklist兼顾链表与压缩列表优势、skiplist实现高效排序),避免“一刀切”的结构设计。

zgzldnr的博客 505
上一篇: PHP之单线程和多进程的理解(CGI,FastCGI,php-cgi,php-fpm)
下一篇: Redis如何处理过期数据 和 内存不够用怎么办?
error0318
博客等级 码龄9年 57粉丝 515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值