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:下一个节点的指针

 

ESP-IDF的安装及其在VScode中编译环境的搭建 从安装目录的\Espressif\frameworks\esp-idf-v5.3.2\examples路径中拷贝一个工程到项目中,比如拷贝\get-started下的hello_world文件夹。安装时可能会遇到如下问题,提示:"e:\ssc\software\ESP-IDF\v5.3.2\Espressif\tools\idf-python\3.11.2\python.exe -m pip" is not valid. (ERROR_INVALID_PIP)接着等待安装完成即可,其他步骤同方式1。 阅读详情

相关推荐

C++中为什么要引入引用变量?

C++引用机制的设计哲学在于平衡性能与安全性。它解决了指针的三个痛点:语法噪音、空指针风险和语义模糊,同时保持了指针的效率优势。引用必须绑定有效对象且不可重绑定的特性增强了安全性,其值语义语法更直观。尤其在运算符重载和const引用场景中,引用展现了不可替代的优势。本质上,引用是编译器优化的指针实现,体现了C++"零开销抽象"的核心思想——既保持底层性能,又提供高级抽象。这种设计允许开发者根据场景灵活选择指针或引用,反映了C++多范式共存的语言智慧。

教学 & 技术专栏 175

一文带你深入理解Hashtable

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

weixin_49307478的博客 1149

用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词)

本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。

weixin_30955617的博客 500

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

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

weixin_35381903的博客 4863

从零到一:在K210上实现YOLO模型在线训练与部署全流程

本文详细介绍了在K210芯片上实现YOLO模型在线训练与部署的全流程,涵盖数据采集、模型优化、量化转换及内存管理等关键环节。通过实战案例和代码示例,帮助开发者高效利用K210的超低功耗特性与YOLO模型的实时检测能力,适用于边缘计算和物联网应用场景。

weixin_29094539的博客 350

ABAP传输自定义IDOC实例

首先确定出站方和入站方,本例中我使用150作为发送方将200作为接收方。 发送端系统配置 进入tcode-SALE,点击定义逻辑系统,这里我定义D01CLNT150为发送端, D01CLNT200为接收端 2,将逻辑系统分配给对应的client 3,进入tcode-WE31,创建IDOC开发段(segment)这里可以按照实际需求创建想要传输的结构,为求简单我创建了ZKNA1并选取了几个客户主数据的字段作为示例 4,进入tcode-WE30,创建Idoc Ty...

Nathan的博客 4077

简述哈希表

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

weixin_52515164的博客 2233

斯坦福大学3D点云模型下载

本文整理了斯坦福大学10个经典的点云(pcd)及其模型(ply),方便日后使用,欢迎免费下载!

孙悟空 7733

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

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

m0_64231944的博客 3403

继电器控制LED灯具导致触点烧蚀粘连的解决办法

继电器控制LED灯具导致触点烧蚀粘连的解决办法

2700

材料仿真软件:LAMMPS_(8).温度和压力控制

在 LAMMPS 中,温度和压力的控制是通过多种恒温器和恒压器实现的。Nose-Hoover 恒温器和恒压器因其准确性和广泛适用性而被经常使用,而 Berendsen 恒温器和恒压器则因其计算效率高而适用于初步仿真或粗粒化模型。温度重标和压力重标方法虽然简单,但在某些情况下可以快速调整系统的温度和压力。通过选择合适的控制方法,可以根据具体的需求和系统特性来设计和运行分子动力学仿真,从而获得准确和可靠的结果。在实际应用中,建议先进行初步的仿真以确定合适的控制参数,然后再进行细致的仿真以验证结果的稳定性。

kkchenjj的博客 1692

关于HashTable

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

looken1024的博客 820

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

Java晋升 366

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

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、付费专栏及课程。

余额充值