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修改字符串,降低预分配带来的内存浪费和内存碎片化。
redis数据结构-动态字符串
猜你喜欢
转载自blog.csdn.net/m0_37780228/article/details/86477119
今日推荐
周排行