redis_简单动态字符串

在redis中,C字符串(以'\0'结尾的字符数组)只用在一些无需对字符串值进行修改的地方,比如打印日志。其他情况,redis使用SDS - SimpleDynamicString 简单动态字符串,来做。

比如

127.0.0.1:6379> set testKey "testValue"
OK

键,是一个字符串对象,底层是一个保存着字符串"testKey"的SDS

值也是一个字符串对象,底层是一个保存着字符串"testValue"的SDS

SDS 定义

struct sdshdr {
    // 记录buf数组中已使用的字节数,等同于字符串长度(不包括结尾的\0)
    int len;
    // 记录buf数组中未使用的字节数
    int free;
    // 实际保存字符串的字节数组
    char buf[];
}

比如一个字符串"test":

  len = 4

  free = 0(这个不一定,初始时为0,后续说明)

  buf[] = 't'、'e'、's'、't'、'\0',注意结尾与C相同,也存在'\0',不记入字符串长度

这样做的特点与优势

1. 常数复杂度获取字符串长度:

  • C字符串不记录长度,只能遍历,到\0得到长度,时间复杂度O(n),SDS可以直接记录len为长度,时间复杂度O(1)

2. 

3. 

4. 

5. 

6. 

猜你喜欢

转载自www.cnblogs.com/loveCheery/p/9133343.html