redis的数据结构简单介绍

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值