redis String数据结构 sdshdr解析

Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simpledynamicstring,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。

 set name val

会产生值为“name”和“val”的2个sdshdr对象  

对象属性如下

为什么不直接用C字符串作为字符串存储对象 有下面几个原因

1 更快的获取length ,c字符串获取长度的时候需要遍历字符,sds可以直接根据Len属性获取

2 减少内存分配操作,C字符串直接加长可能导致缓冲区覆盖的问题,需要重新内存分配,然而内存分配是比较耗时的事情,redis为了减少内存分配的操作,每次修改字符串,当发现buf[]长度不够储存修改后的字符串的时候,会分配新字符串2倍的容量给与buf[]。

  比如

    修改前  属性 buf[]长度=5 值=redis  , len=5,  free=0

  将字符串修改为redisgood,会发现缓冲区不够,需要重新分配内存,需要内存为9,但是redis会给分配为18,

    修改成功后 属性 buf[]长度=18 值=redisgood  , len=9,  free=9

  会发现有空余的长度为9的缓冲区,如果下次修改,字符串长度没有超过18,就不会重新分配缓冲区,大大提升了写入性能

  如果字符串大小超过了1mb,就不会使用这个机制了,会变成需要多少内存,分配多少内存

3 惰性空间释放,sds用free记录空闲的空间,会在后期需要的时候才会释放这部分空间

4 二进制兼容,在C字符串中,遇到空格,就会认为是一个新字符串,这样就导致不能存储图片之类的二进制数据,然而sds的api是兼容二进制储存的。

发布了19 篇原创文章 · 获赞 11 · 访问量 3075

猜你喜欢

转载自blog.csdn.net/qq_28056571/article/details/103082249
今日推荐