redis的数据结构简单介绍

这里选择的redis的5.0的版本来做一个简单的介绍,对于每个数据结构到底是什么,每种结构怎么转化,为什么这样做,并没有做一个详细的介绍!

  • 基础
    总所周知,redis是一个K-V类型的数据库,所以它的基本数据结构一定是一个类似java中的Map的结构,在redis中它的K-V是由一个dictEntry中存储的,具体结构如下redis的数据结构简单介绍
    • 存储key的数据结构
      在redis中,并没有用直接使用C语言的字符数组来存储,而使用的是一个自定义的SDS(Simple Dynamic String) 来存储的,源码如下redis的数据结构简单介绍
      类似于java中的多个构造方法(可能不太恰当),告诉我们到底使用的是多大的数据来存储
    • 在dictEntry中的val会指向另一个对象,就是redisObject,如下图redis的数据结构简单介绍
      这里的的ptr就会指向真正存储我们不同数据类型的地方
  • 常用的数据类型
    • string 有3种存储的数据结构
      • int 用来存储最大8个字节的长整形 2^63-1
      • embstr 也是一个SDS,存储的是小于44个字节的字符串
      • raw 同样也是SDS存储大于44个字节的字符串
    • hash 有2种存储结构
      • ziplist 压缩列表,源码中有这样的一个图来帮我们对ziplist有一个简单的理解redis的数据结构简单介绍
        图中的一个一个entry就是我们的的hash内部的map的存储,这个entry的数据结构如下
        redis的数据结构简单介绍
      • hashtable hashtable是对我们文章开头讲的dictEntry的一次封装,大概是下面的这样的一个流程dict--->dictht[2]--->dictEntry[n],具体代码如下图
        redis的数据结构简单介绍
    • list 使用的是叫做quicklist的一个数据结构,他的实现使用了1*n个链表来进行存储
      • 最上层一个quicklistredis的数据结构简单介绍
        一个quicklist中有多个quickListNode,而每个node又是一个ziplistredis的数据结构简单介绍
    • set
      • 当元素都是整数的时候使用intset
      • 当有字符的时候,使用的还是hashtable的key来实现的,这里我们可以类比java中的HashSet和HashMap
    • zset
      • 有序的zipList
      • skiplist (跳表) redis的数据结构简单介绍