redis数据结构-动态字符串

Sds是Redis 底层所使用的字符串表示,Redis 使用sds 类型替换了C 语言的默认字符串表示:sds 既可以高效地实现追加和长度计算,并且它还是二进制安全的
        typedef char * sds;        //类型sds 是char * 的别名
        struct sdshdr {            //结构sdshdr 则保存了len 、free 和buf 三个属性。
            // buf 已占用长度
            int len;
            // buf 剩余可用长度
            int free;
            // 实际保存字符串数据的地方
            char buf[];
        };
        注意,当调用SET 命令创建sdshdr 时,sdshdr 的free 属性为0 ,Redis 也没有为buf 创建额外的空间——而在执行APPEND 之后,Redis 为buf 创建了多于所需空间一倍的大小。
        在这个例子中,保存"hello world again!" 共需要18 + 1 个字节,但程序却为我们分配了18 + 18 + 1 = 37 个字节——这样一来,如果将来再次对同一个sdshdr 进行追加操作,只要
        追加内容的长度不超过free 属性的值,那么就不需要对buf 进行内存重分配。
        Note: 这种分配策略会浪费内存吗?
        开发提示:尽量减少字符串频繁修改操作如append,setrange, 改为直接使用set修改字符串,降低预分配带来的内存浪费和内存碎片化。

猜你喜欢

转载自blog.csdn.net/m0_37780228/article/details/86477119