你真的了解Redis的数据结构吗

Redis作为高并发程序的必备神器,基本是必不可少的一款中间件,在日常使用中,对Redis的增删改查的过程中,你有没有想过每条命令在Redis中是如何执行的,不同的数据类型是通过什么样的数据结构保存在Redis的内存中呢?什么!不知道? 没关系,看完这篇文章你就知道了~

Redis在日常开发中常用的五种数据结构,分别为StringListHashSetZset,不同的应用场景不同的数据结构来支持,下面就一起看看到底是什么样的数据结构让Redis这么快,开干!

干

对象

Redis数据库中,我们常用的五种数据类型并不是由某种数据结构直接实现,而基于数据结构构建了对象系统,包含字符串对象列表对象哈希对象集合对象有序集合对象,每种对象都至少使用到2中数据结构进行实现!

  • 对象的结构

    typeof struct redisObject {
         
        // 对象类型
        unsigned type:4;
        // 编码
        unsigned encoding:4;
        // 指向底层具体数据结构的指针
        void *ptr;
    }
    
    • 类型:一共有5中类型,分别为字符串对象列表对象哈希对象集合对象有序集合对象

      type key – 查看key的类型

    • **编码:**编码标识对象使用了什么样的编码,即具体的底层数据结构是什么(不同的编码,则不同的数据结构来实现),并且不同编码之间会根据具体保存的数据转换。

    • **指针:**执行对象的底层数据结构的指针

字符串对象String

String在Redis中准确的应该是字符串对象,字符串对象的底层实现数据结构分别有:intrawembstrsds等。

int、raw、embstr编码格式

这三种实现分别是字符串的不同编码格式,当不同类型的字符串时,使用不同的编码格式进行存储,最大程度的节约内存和提升效率。当字符串中保存的都是整数,会使用int类型的编码,当保存的字符串较短时,则使用rawembstr进行保存。

SDS编码格式

众所周知,Redis是使用C语言写的,但是其中的字符串并没有使用C语言中的字符串,而是自己实现了字符串,名为简单动态字符串(SDS)

Redis中不仅将SDS作为String的底层数据结构的实现,同时SDS还应用于各种场景,例如:列表、Redis的key等。

SDS的实现

既然Redis舍弃了C语言中的字符串, 单独实现了SDS作为字符串的实现,那么SDS有哪些优点呢

  • SDS的结构

    struct sdshdr {
         
        // 记录sds字符串的长度,相当于buf数组中已使用的长度
        int len;
        // 记buf数组中还没有使用的长度,可用长度
        int free;
        // 字符数组,保存字符串
        char buf[];
    }
    

    首先可以看到sds的结构定义,记录了自身的字符串的长度,没有使用的内存长度,相对于C字符串可以提升较大的使用效率

  • 与C字符串区别

    • 当使用命令strlen时:C字符串并不记录自身的长度&

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值