简单动态字符串(SDS)

Redis中,包含字符串值的键值对在底层都是由SDS实现的

redis > SET msg "hello world"

  • 键值对的键是一个字符串对象,对象的底层实现是一个保存字符串“msg”的SDS。
  • 键值对的值也是一个字符串对象,同上。

redis > RPUSH fruits "apple" "banana" "cherry"

  • 键值对的键是一个字符串对象,对象的底层实现是一个保存字符串“fruits ”的SDS。
  • 键值对的值也是一个列表对象,列表对象包含了三个字符串对象。这三个对象分别由三个SDS实现。
struct sdshdr {
//记录buf数组中已使用字节的数量
//等于SDS所保存字符串的长度
    unsigned int len;
//记录buf数组中未使用字节的数量
    unsigned int free;
//用于保存字符串
    char buf[];

常数复杂度获取字符串长度

c字符串获取其本身长度的时间复杂度为O(n),SDS能够常数复杂度获取字符串长度

杜绝缓冲区溢出

当SDS API需要对SDS进行修改时,API会先检查SDS的空间是否满足修改所需的空间

减少修改字符串时带来的内存重分配次数

空间预分配法

当SDS的API对一个SDS进行修改,并对SDS进行空间扩展的时候,程序不仅会为SDS分配修改所必须的空间,还为SDS分配额外的未使用空间。

惰性空间释放法

当SDS的API需要缩短SDS保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出的字节,而是用free将之记录下来。

SDS使用len属性的值而不是空字符串来判断字符串是否结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Redis使用的是自己构建的简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将...
    但莫阅读 517评论 0 0
  • Redis SDS与C字符串区别 Redis没有直接使用C语言传统的字符串,而自己构建了一种简单动态字符串(Sim...
    binge1024阅读 1,517评论 0 0
  • 青苔为我编织好了绿色的嫁衣 红锈替我化好了嫁妆 我静静地站在巷口 等待你的出现 顽劣的孩子拨弄我的眉间 在母亲的呵...
    熟悉的秋天阅读 190评论 0 0
  • 今天把昨天错过的刘轩老师十点课堂直播听完了。这次的主题是年终盘点,2017走向更好的自己。刘轩老师提了三个...
    ly晓得饭阅读 262评论 2 0