美文网首页
简单动态字符串(SDS)

简单动态字符串(SDS)

作者: sony93 | 来源:发表于2017-06-19 21:33 被阅读0次

    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属性的值而不是空字符串来判断字符串是否结束

    相关文章

      网友评论

          本文标题:简单动态字符串(SDS)

          本文链接:https://www.haomeiwen.com/subject/scbpqxtx.html