首页 > 数据库 >浅谈Redis底层数据结构(sdshdr-redisObject)

浅谈Redis底层数据结构(sdshdr-redisObject)

时间:2023-01-18 22:33:10浏览次数:41  
标签:浅谈 Redis redisObject redis value hashTable buf 结构


最近看了点Redis底层的源码分析,特作此记录

前提共识:

  1. Redis是一个默认为16个数据库的key-value内存数据库
  2. Redis底层是由C语言实现


文章目录

  • ​​C语言源码流程​​
  • ​​1、server.c​​
  • ​​2、dict.h​​
  • ​​3、sds.h​​
  • ​​4、redisObject​​
  • ​​5、大体流程​​

下列代码为官网下载的Redis6.2.6版本

C语言源码流程

1、server.c

以该文件中的redisDb结构体为起点

通过注释,我们不难发现*dict指向的,就是我们的单个数据库

浅谈Redis底层数据结构(sdshdr-redisObject)_数据结构





2、dict.h

由dict结构体变量开始,代码依次向上调用

该过程可以梳理为:在Redis的一个数据库中,存在两个map结构,这个map的key变量为*key,这个map的value变量为v,并且这个map的节点类似于链表的结构,其内部含有一个同类型并且名字为*next的节点。不知此时你是否意识到,该结构和JDK1.7中HashMap的结构相同,只是在Redis中,这种结构叫做HashTable

浅谈Redis底层数据结构(sdshdr-redisObject)_redis_02



补充:

1、ht[2]:表示有两个hashTable表,存放数据时只会使用到一个hashTable表结构,但是该结构会因为数据量过大而出现扩容的情况。与之对应的就是第二个hashTable结构就是用来存放扩容后的新数据集。该扩容过程,采用渐进式hash的过程,即不会在扩容后立刻就完成数据的转移,而是再接下来每次get到数据的时候再进行数据的转移,如果没有get请求,那么redis后台也会慢慢的将数据更新到新的hashTable结构上。最终数据全部完成转移后,老的hashTable结构被释放,新的hashTable被标记为老的结构。待到下次扩容,以此反复。

2、redis数据结构:类比JDK1.7中的HashMap数据结构,数组+链表的数据结构。预分配一个数组用于存放数据,出现hash冲突,向hash桶的位置以头插法的形式添加数据。





3、sds.h

sds可以可以理解为map中每一个entry的key

sds内部含有存放数据的buf数组、一个字节的flags,在sdshdr5的时候用来保存类型和长度,其他几个sdshdrx仅用来保存类型。该sds数据结构在redis3.2以前直接是一个大的sdshdr节点,内含buf、len、free等变量,后续优化数据才出现了下面的按照数据长度进行细分的sdshdr节点。

浅谈Redis底层数据结构(sdshdr-redisObject)_redis_03



sds内部buf的扩容机制:新buf长度 = (原buf长度 + 添加buf长度)*2。如果buf长度大于1M后,每次扩容也只会增大1M





4、redisObject

在server.h文件中,含有一个redisObject的结构体,它就是map中entry节点里的value。该结构体是redis中一切value的原型。

  • type:string、list、hash、set、zset。校验客户端操作命令的正确性,一个string类型,不能用lpush命令进行操作
  • encoding:raw、embstr、int、ziplist…。可以在客户端使用object encoding key来查看,作用为查看key对应的value在redis底层使用的是什么数据类型来存储
  • refcount:redis使用引用计数法处理垃圾回收
  • *ptr:真正的指向redis的value在内存中的地址值

浅谈Redis底层数据结构(sdshdr-redisObject)_redis_04





5、大体流程

浅谈Redis底层数据结构(sdshdr-redisObject)_redis_05


标签:浅谈,Redis,redisObject,redis,value,hashTable,buf,结构
From: https://blog.51cto.com/u_15942107/6019542

相关文章

  • 浅谈Zookeeper集群选举Leader节点源码
    写在前面:zookeeper源码比较复杂,本文讲解的重点为各个zookeeper服务节点之间的state选举。至于各个节点之间的数据同步,不在文本的侧重讲解范围内。在没有对zookeeper组件有一......
  • 浅谈Redis基本数据类型底层编码(含C源码)
    文章目录​​一、String​​​​1、int​​​​2、embstr​​​​3、raw​​​​4、bitmap​​​​5、hyperloglog​​​​二、List​​​​1、ziplist​​​​2、quicklist......
  • 浅谈如何设计MySQL索引
    文章目录​​一、索引的代价​​​​二、如何设计索引​​​​1、索引列的类型尽量小​​​​2、索引的选择离散性高的​​​​3、只为用于搜索、排序或分组的列创建索引​......
  • 【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
    问题描述使用6379端口连接AzureRedis服务,连接失败。因为默认情况下AzureRedis的设置没有打开6379的端口。需要使用SSL(6380端口)进行连接,但是遇见了无法连接的问题。使......
  • redis:value的的五种数据类型【reggie_take_out】
    有序集合经典应用:排行榜......
  • Redis学习之旅(1)
    1、学习路线​从这章开始,我们开始系统的学习redis,说白了,就是希望花很少的时间掌握更丰富的知识和经验,解决更多的问题,这就要我们能够抓住主线,在自己的脑海中绘制一幅......
  • 技术实践|浅谈Elasticsearch跨集群搜索
    前言Elasticsearch(简称ES)是基于Lucene库的分布式架构搜索引擎。它支持水平横向扩展,但是集群节点不能无限增加。因为当集群的meta信息(节点、索引、集群状态)过多时,会使集群更......
  • Redis
    RedisTemplatetimeunit时间单位......
  • Redis学习之旅(1)
    1、学习路线从这章开始,我们开始系统的学习redis,说白了,就是希望花很少的时间掌握更丰富的知识和经验,解决更多的问题,这就要我们能够抓住主线,在自己的脑海中绘制一幅Redis全......
  • Redis学习
    Redis使用场景最新N个数据通过List实现按自然时间排序的数据排行榜,TopN利用zset(有序集合)时效性的数据,比......