简单的动态字符串
- redis没有直接使用C语言传统的字符串表示,而自己构建了一个动态字符串SDS,当redis需要的不仅仅是一个字符串字面量,而是一个可以被秀噶ide字符串值时,redis就会使用sds来表示字符串值,比如在redis的数据库里,包含字符串值的键值对在底层都是由SDS实现的。
redis > set name "bugall"
ok
1.键值对的键是一个字符串对象,对象的底层实现是一个保存着字符串"name"的SDS
2.键值对的值也是一个字符串对象,对象的底层实现是一个保存这字符串"bugall"的SDS
- 除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区,AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区。
struct sdshdr{
//记录buf数组中已使用字节的数量
//等于SDS所保存字符串的长度
int len;
//记录buf数组中未使用字节的数量
int free;
//字节数组,用于保存字符串
char buf[];
}
1. free属性的值为0,表示这个SDS没有分配任何未使用空间。
2. len属性的值为5,表示这个SDS保存了一个五字节长的字符串
3. buf属性是一个char类型数组,数组的前5个字节分别保存了‘r‘,‘e‘,‘d‘,‘i‘,‘s‘五个字符,而最后一个字节则保存了空字符‘\0‘
注意:保存孔子福的1字节空间不计算在SDS的len属性里面,并且为空字符分配额外的一字节空间。
- 与c字符串不同,SDS的空间分配策略完全杜绝了发生缓冲区溢出的可能性,当SDS api 需要对SDS进行修改时,API 会先检查SDS的空间是否满足修改所需要的要求,如果不满足的话,API会自动将SDS的空间拓展至执行修改所需要的大小,然后才执行实际的修改操作,所以使用SDS即不需要手动修改SDS的空间大小,也不会出现的缓冲区溢出的情况。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-16 03:21:02