【Redis原理篇】五大基本数据类型的底层编码方式

上文:redis底层数据结构

String底层结构

一、编码方式

1.int编码
  • **适用范围:**64位整数(long

  • **实现:**直接将数据存储在redisObjectptr指针位置。

  • 内存布局:

    在这里插入图片描述

2.embstr编码
  • **适用条件:**字符串大小<44字节

    • **实现:**将redisObjectSDS分配在连续内存中。
  • 内存布局:

    在这里插入图片描述

    • redisObject (16B)
      SDS头 (3B) 
      字符串数据 (44B)  
      结尾'\0' (1B) 
      
    • 总占用:16 + 3 + 44 + 1 = 64字节(刚好利用jemalloc(按2的次方分配内存)的64B内存块,减少碎片)。

  • 特点

    • 内存连续,访问高效(减少CPU缓存缺失)。
    • 只读设计,修改时自动转为raw编码。
3.raw编码
  • 适用条件:字符串长度 > 44字节或含二进制数据。
  • 实现redisObjectSDS分两次分配内存,ptr指向独立的SDS结构。
  • 内存布局:在这里插入图片描述

二、编码转换场景

1.int → raw

执行非整数操作(如APPEND非数字字符)。

2.embstr → raw

修改embstr字符串(因embstr内存不可变)。

List底层结构

一、List的底层演进

Redis版本底层结构特点
❤️.0ziplist 或 linkedlist小数据用ziplist(内存紧凑),大数据用linkedlist(操作高效)
3.0~3.2quicklist(过渡阶段)初步引入分段ziplist设计
≥3.2quicklist(默认统一实现)每个节点为ziplist,通过双向链表连接,平衡内存与性能

Set底层结构

一、编码方式

1.intset
  • 适用条件:
    • 所有元素均为 整数(int64_t 范围)。
    • 元素数量 ≤ set-max-intset-entries(默认 512)。
  • 特点
    • 内存紧凑:无指针开销,连续存储整数。
    • 自动升级:插入超出当前编码范围的整数时,升级为更大编码。
    • 二分查找:元素有序,查找时间复杂度 O(log n)
  • 缺点:
    1. 不支持非整数类型元素
      intset 设计初衷是存储整数,只能保存整数。如果尝试往intset里添加非整数类型的数据(如字符串、浮点数等),Redis 会将 intset 升级为 hashtable 来存储。
    2. 升级操作开销大
      当插入的新元素类型比 intset 现有元素类型长时,需要进行升级操作。整个升级过程涉及大量内存操作和数据类型转换,时间复杂度为 O ( N ) O(N) O(N),在大数据量场景下,会带来较大性能开销。
    3. 查找效率在数据量增大时降低
      intset 内部使用有序数组存储元素,查找元素时采用二分查找算法,平均时间复杂度为 O ( l o g N ) O(log N) O(logN)。虽然二分查找效率较高,但随着元素数量 N 不断增加,查找时间也会相应变长。相比哈希表(平均查找时间复杂度为 O ( 1 ) O(1) O(1)),在大数据量场景下,intset 的查找效率会处于劣势。
    4. 插入和删除操作效率问题
      插入和删除元素时,为了保持数组的有序性,需要移动大量元素。插入或删除操作的平均时间复杂度为 O ( N ) O(N) O(N),,在大数据量场景下,频繁的插入和删除操作会严重影响性能
2.dict(hashtable)
  • 适用条件

    • 元素包含 非整数
    • 元素数量 > set-max-intset-entries
  • 结构设计在这里插入图片描述

  • 特点

    • O(1) 时间复杂度:插入、删除、查找均高效且无intset升级操作。
    • 内存开销大:每个元素需存储 Entry 结构(键指针 + next 指针)。

二、编码转换机制

1. intset → hashtable
  • 触发条件
    • 插入 非整数元素
    • 元素数量超过 set-max-intset-entries

三、内存与性能对比

维度intsethashtable
内存占用低(无指针,连续存储)高(Entry 结构 + 指针)
插入性能O(n)(需维护有序性)O(1)(平均)
查找性能O(log n)(二分查找)O(1)(哈希查找)
适用场景小规模纯整数集合大规模或含非整数元素的集合

ZSet底层结构

一、编码方式

1. ziplist(压缩列表)
  • 适用条件

    • 元素数量 ≤ zset-max-ziplist-entries(默认 128)。
    • 所有元素值(member)长度 ≤ zset-max-ziplist-value(默认 64 字节)。
  • 存储方式

    • 元素(member)和分数(score)成对存储,按分数升序排列。

    • 结构示例:

      在这里插入图片描述

      特点

    • 内存紧凑:连续内存块存储,无指针开销。

    • 插入/删除低效:需重分配内存并移动数据,时间复杂度 O(n),大数据量场景下性能低。

2. skiplist(跳跃表) + dict(哈希表)
  • 适用条件
    • 元素数量或值大小超过上述阈值。
  • 结构设计
    • 跳跃表(zskiplist)
      • 按分数排序,支持 O(log n) 的插入、删除和范围查询。
      • 节点结构包含成员(member)、分数(score)、多层前向指针。
    • 哈希表(dict)
      • 键为成员(member),值为分数(score),支持 O(1) 的成员查找。
  • 协作机制
    • 插入:同时向跳跃表和哈希表插入数据,保证一致性。
    • 查询:哈希表快速定位分数(zscore),跳跃表处理范围操作(zrange zrevrange zrangebyscore)。
  • 特点
    • 查询效率高
    • 内存开销大

二、编码转换机制

  • ziplist → skiplist
    • 触发条件:插入元素导致数量或值大小超限。
    • 过程:遍历 ziplist,将所有元素插入跳跃表和哈希表。

Hash底层结构

Hash底层采用的编码与Zset基本一致,只需要把排序有关的SkipList去掉即可。

一、编码方式

1.ziplist
  • 适用条件
    • 字段数量 ≤ hash-max-listpack-entries(默认 512)。
    • 每个字段的值长度 ≤ hash-max-listpack-value(默认 64 字节)。
  • 结构特点
    • 内存紧凑:连续存储字段-值对,无指针开销。
    • 顺序存储:字段和值按添加顺序排列,适合小数据量。
    • 快速遍历:支持线性遍历,但随机访问需顺序查找。
  • 操作限制
    • 插入/删除低效:需内存重分配和数据移动,时间复杂度 O(n)。
    • 自动转换:超出阈值时转为hashtable。
2.hashtable(字典dict)
  • 适用条件
    • 字段数量或值大小超过listpack/ziplist阈值。
  • 结构设计
    • 哈希表:使用链地址法解决冲突,每个哈希节点存储字段和值的指针。
    • 快速操作
      • 查找/插入/删除:平均 O(1) 时间复杂度。
      • 支持大规模数据:动态扩容缩容,适应数据增长。
  • 内存开销
    • 每个字段需额外存储指针和哈希表元数据,内存占用较高。

二、编码转换机制

  • listpack/ziplist → hashtable
    • 触发条件:字段数超限或单个值超长。

三、内存结构

在这里插入图片描述

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

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

相关文章

自动编码器 潜在空间 Autoencoders 视频截图

【双语】Autoencoders_哔哩哔哩_bilibili 【双语】Autoencoders_哔哩哔哩_bilibili

ZLG USBCANFD python UDS刷写脚本

文章目录 概述python UDS 刷写脚本UI交互界面概述 在实际工作中,有使用周立功的UDSCANFD设备,用来收发CAN数据和UDS on CAN的诊断测试或者UDS on CAN的ECU升级。上位机使用ZCANPro,软件自带ECU刷新界面,可以编辑UDS服务,加载升级文件等,能用是能用,但是仍不能满足一些特…

线程安全问题的成因

前言 大家晚上好呀~~ 今天学习了线程不安全问题的成因。线程安全问题是十分重要的知识点&#xff0c;我想把我所学的与大家分享一波&#xff0c;希望可以帮助到有需要的人&#xff0c;同时加深自己对于线程安全问题的理解。 分析过程如下 结语 今天心情还不错~ 要坚持持续…

C++可变参数宏定义语法笔记

1. 基础语法 定义格式&#xff1a; #define MACRO_NAME(fixed_args, ...) macro_body#define LOG(fmt, ...) printf(fmt, __VA_ARGS__) LOG("Value: %d, Name: %s", 42, "Alice"); // 展开为 printf("Value: %d, Name: %s", 42, "Alice&q…

mongodb安装启动

这里写自定义目录标题 安装包下载安装后文件目录列表bin目录下 mongod 可以对mongodb 进行启动等操作 环境变量配置创建数据目录&#xff0c;日志目录启动参数配置启动 mongodbweb页面访问&#xff0c;检查服务启动是否正常可视化工具连接mongodb创建 database创建collection查…

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts 1. 解题思路2. 代码实现 题目链接&#xff1a;3562. Maximum Profit from Trading Stocks with Discounts 1. 解题思路 这一题没有搞定&#xff0c;思路上整体走偏了&#xff0c;看了一下别人的解答&…

【Redis】第2节|Redis基本数据类型

一、基础数据结构 1. String&#xff08;字符串&#xff09; 特点&#xff1a;二进制安全&#xff0c;支持字符串、数值存储&#xff0c;原子性操作。核心操作&#xff1a; SET key value # 存储键值对 GET key # 获取值 INCR key # 数值…

用matlab提取abaqus odb文件中的节点信息

在MATLAB中提取Abaqus ODB文件中的节点信息&#xff0c;可以通过以下几种方法实现&#xff1a; 方法1&#xff1a;使用MATLAB的ABAQUS Interface工具箱 https://wenku.csdn.net/answer/77axwtqnys 可以参考这个 MATLAB的ABAQUS Interface工具箱提供了直接读取ODB文件的功能。…

【Java】异常处理

1.异常的概念 在程序运行时&#xff0c;打断正常程序流程的不正常情况分两类: 1.错误(Error)&#xff1a;应用程序无法捕获的严重问题(自己无法处理) 例&#xff1a; 虚拟机相关的问题&#xff0c;如虚拟机崩溃、动态链接失败、低层资源错误等 总是不受编译器检查的&#xff0…

Linux(Centos 7.6)命令详解:tar

1.命令作用 命令tar将许多文件一起保存到单个磁带或磁盘存档中&#xff0c;并且可以从存档中恢复单个文件(GNU tar saves many files together into a single tape or disk archive, and can restore individual files from the archive.)。 2.命令语法 Usage: tar [OPTION.…

企业网络综合实训

企业网络综合实训 任务描述&#xff1a; 公司的中心机房、办公区一和办公区二位于同一园区。要求各大楼之间要互通&#xff0c;并且均能访问Internet&#xff1b;同时公司业务需要对外拓展&#xff0c;需要在Internet数据中心机房部署一台对外提供DNS和Web站点服务的服务器。…

8天Python从入门到精通【itheima】-41~44

目录 41节-while循环的嵌套应用 1.学习目标 2.while循环的伪代码和生活情境中的应用 3.图片应用的代码案例 4.代码实例【Patrick自己亲手写的】&#xff1a; 5.whlie嵌套循环的注意点 6.小节总结 42节-while循环的嵌套案例-九九乘法表 1.补充知识-print的不换行 2.补充…

探索Linux互斥:线程安全与资源共享

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 互斥是并发编程中避免竞争条件和保护共享资源的核心技术。通过使用锁或信号量等机制&#xff0c;能够确保多线程或多进程环境下对共享资源的安全访问&#xff0c;避免数据不一致、死锁等问题。 竞争条件 竞…

《Stable Diffusion 3.0企业级落地指南》——技术赋能与商业价值的深度融合实践

Stable Diffusion 3.0&#xff08;SD3&#xff09;作为当前多模态生成式AI技术的集大成者&#xff0c;凭借其创新的扩散Transformer架构&#xff08;DiT&#xff09;、流匹配&#xff08;Flow Matching&#xff09;技术以及超分辨率生成能力&#xff0c;正在重塑企业内容生产的…

基于本地模型+多级校验设计的高效缓存,有效节省token数量(有点鸡肋doge)。

前言 我是基于token有限而考虑的一个省钱方案&#xff0c;还能够快速返回结果&#xff0c;但是劣势也很明显&#xff0c;设计不好容易出问题&#xff0c;就如下面所介绍的语义飘逸和缓存污染&#xff0c;我认为在自己学习大模型的过程用来省钱非常可以&#xff0c;再加上学习过…

网络安全全知识图谱:威胁、防护、管理与发展趋势详解

1 网络安全基础概念 1.1 什么是网络安全 网络安全是指通过技术、管理和法律等手段&#xff0c;保护计算机网络系统中的硬件、软件及其系统中的数据&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;确保系统连续可靠正常地运行&#xff0c;网络服务不…

远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比

【作者主页】Francek Chen 【文章摘要】在数字化时代&#xff0c;卓越的远程控制软件需兼顾功能与体验&#xff0c;包括流畅连接、高清画质、低门槛UI设计、毫秒级延迟及多功能性&#xff0c;同时要有独树一帜的远控安全技术&#xff0c;通过前瞻性安全策略阻挡网络风险&#x…

Steam发布游戏过程的若干问题

我没有想到在Steam发布游戏的过程会比做游戏的过程更困难&#xff0c;更恶心。 注册Steamworks 税务采访 税务采访部分填的地址要和后面它们要求你发证件照片里的地址一样。护照里因为没有地址不会通过&#xff0c;我用的驾照里面有地址。没有驾照可以用身份证。 应用准备界…

开搞:第四个微信小程序:图上县志

原因&#xff1a;我换了一个微信号来搞&#xff0c;因为用同一个用户&#xff0c;备案只能一个个的来。这样不行。所以我换了一个。原来注册过小程序。现在修改即可。注意做好计划后&#xff0c;速度备案和审核&#xff0c;不然你时间浪费不起。30元花起。 结构&#xff1a; -…

第三十七天打卡

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50轮&#x…