redis的底层数据结构详解

 更新时间:2025年02月19日 11:23:47   作者:nodelaynow  
Redis性能高得益于其优化的数据结构,Redis的数据结构分为对外暴露的和内部底层的两种,对外暴露的数据结构包括String、list、hash、set、zset等,而内部底层的数据结构则包括SDS、hashtable、ziplist、linkedlist、quicklist、intset、skiplist等

redis性能高的原因很大程度上是由于它的每一种数据结构都经过专门设计来应对不同场景

redis的数据结构本质上可以分为两层,对外暴露的数据结构以及内部底层的数据结构

1. redis数据结构层次

1.1 外部数据结构

对外暴露的数据结构即我们所使用的String,list,hash,set,zset等

1.2 内部数据结构

redis内部有更为精细的实现,总的来说有以下几种:

SDS,hashtable,ziplist,linkedlist,quicklist,intset,skiplist等

2. redis底层实现

2.1 String字符串类型的底层实现

字符串类型的底层实现主要依赖于SDS这种数据结构,相较于传统的C语言所表达的字符串,SDS内部作出改动,包含了len(字符串真实的长度),buf[](存放字符串数据的数组),alloc(buf数组所拥有的实际长度),flags。

不同字符串长度会使用相同结构但不同长度的SDS数据结构(内部buf,alloc会不同),flags就是用来指定你用的是哪一种。

SDS除开长度所导致的结构不同,具体的编码模式也会随着传值不同而不同,总的来说分为三种:RAW,EMBSTR,INT(写作int类型 但是实际上存储的是long)。

当外部传来一个值为字符串类型的value时,redis会首先使用RAW接收,然后出于节省内存考虑,转化为INT或者EMBSTR类型的编码方式。

这样的好处是,当我们试图对字符串进行increment这种操作时,int类型会自动直接加1,而str会试图转化为int,然后再加1,而当我们进行append这类操作时,int类型会试图转化为str再执行,而str会直接执行,不然编码方式不同,对于某些情况下的命令结果也会不同

2.2 Hash类型的底层实现

hash类型的底层实现主要分为两种,ziplist和hashtable

ziplist是一块存放于连续内存的链表,基于内存连续,它的读取效率很高,寻找元素时直接遍历,内部不存储前后节点这类数据,但是也正因为内存连续,它本身也会收到一些限制,实际上ziplist要满足以下两种条件才会被使用

  • 长度小于512
  • 单个value小于64字节

如不满足,强行使用,会导致涉及插入修改等发生的内存拷贝成本较大,影响性能。

而不满足时,我们会使用hashtable来实现,哈希表里面的hash搜索能保证时间复杂度接近O(1),以链表数组的方式解决hash冲突,而当哈希表需要进行扩容时,为了避免单次扩容所导致的响应时间剧烈增加,它将单次扩容所需要的重哈希分散到后续对哈希表的增删改查操作里,一步步进行hash扩容。

2.3 list类型的底层实现

list类型在redis3.2之前使用ziplist或者linkedlist去实现,而在3.2之后使用quicklist去实现。

quicklist是一种结合了ziplist和linkedlist两者的链表数据结构,内部每个节点即为一个ziplist,这样的设计实际上是对空间和时间的这种。

对于一个双向列表而言,不仅需要保存内部数据,还要维护前后指针,占用空间;当列表长度过长时,也会产生碎片化问题,因此我们将部分数据封装在一个ziplist里,减少指针个数,并且减少内存脆片,当然ziplist本身也不宜设置过长,找不到足够大的连续空间给ziplist的话,存储效率也会下降。具体长度设置要取决于业务场景。

2.4 set类型的底层实现

set类型主要由hashtable和intset实现

当内部数据全为整数并且内部数据量小于512个时,就使用intset去实现,intset本质上是一个由整数实现的有序集合,内部使用二分查找,和ziplist一样,也是一块连续的内存空间,并且针对证书大小也进行了不同的编码来实现对内存的优化。

当不满足条件时,就会使用hashtable去实现,key即为存储数据,因为我们不关心value的值,所以value一般存储为null值。

2.5 zset类型的底层实现

zset类型由skiplist(跳表)来实现,以 1 2 3 4 5 6 7 8 9 10中查找7为例,按照链表而言,要一个一个遍历去查找,而对于跳表,每个节点内部会随机储存下一个目标以及跳过的层数,比如从1开始,跳到4,4<7,因此不需要关心1-4之间的数据,4跳到8,8>7,因此回溯到4,4跳到6,然后6跳到8,发现8>7,因此回溯到6,6跳到7,这就是跳表的基础原理,每个节点内部会储存下一个节点以及能够跳跃的节点。

那么是怎么设定每个节点能够跳跃到哪些节点的呢?

每个节点在初始化时,会随机设置一个level数组来表明自身的层级(随机概率p由开发者设定),最下面一层存储下一个节点,第二层存储下一个拥有二层数组的节点,第三层存储下一个拥有三层数组的节点,最终打到尾节点上。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • redis在spring boot中异常退出的问题解决方案

    redis在spring boot中异常退出的问题解决方案

    这篇文章主要介绍了redis在spring boot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • Redis遍历海量数据的实现示例

    Redis遍历海量数据的实现示例

    本文主要介绍了 Redis遍历海量数据的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • 利用Redis实现访问次数限流的方法详解

    利用Redis实现访问次数限流的方法详解

    这篇文章主要给大家介绍了关于如何利用Redis实现访问次数限流的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Redisson延时队列RedissonDelayed的具体使用

    Redisson延时队列RedissonDelayed的具体使用

    定时调度基本是每个项目都会遇到的业务场景,一般地,都会通过任务调度工具执行定时任务完成,但是会有一定的缺点,本文主要介绍了Redisson延时队列RedissonDelayed的具体使用,感兴趣的可以了解一下
    2024-02-02
  • Redis特殊数据类型HyperLogLog基数统计算法讲解

    Redis特殊数据类型HyperLogLog基数统计算法讲解

    这篇文章主要为大家介绍了Redis特殊数据类型HyperLogLog基数统计算法讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Redis键迁移(move、dump、restore、migrate)的三种实现

    Redis键迁移(move、dump、restore、migrate)的三种实现

    键迁移就是把数据由一个Redis迁移到另一个Redis,本文主要介绍了Redis键迁移(move、dump、restore、migrate)的三种实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Redis集群的离线安装步骤及原理详析

    Redis集群的离线安装步骤及原理详析

    这篇文章主要给大家介绍了关于Redis集群的离线安装步骤及原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • redis实现sentinel哨兵架构的方法

    redis实现sentinel哨兵架构的方法

    哨兵是一个分布式系统,可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossip protocols)来接收关于Master主服务器是否下线的信息,这篇文章主要介绍了redis实现sentinel哨兵架构,需要的朋友可以参考下
    2022-11-11
  • Redis接口访问优化的方法步骤

    Redis接口访问优化的方法步骤

    本文基于之前的Redis接口访问进行优化,引入了接口防抖功能,通过时间段参数限制接口调用频率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • 简单粗暴的Redis数据备份和恢复方法

    简单粗暴的Redis数据备份和恢复方法

    这里我们来讲解一个简单粗暴的Redis数据备份和恢复方法,有一个在不同主机上迁移Redis数据的示例,还有一个备份脚本实现的关键点提示,一起来看一下:
    2016-06-06

最新评论