redis_简单动态字符串

Posted 阿智 mikeve@163.com

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 

 

以上是关于redis_简单动态字符串的主要内容,如果未能解决你的问题,请参考以下文章

redis源码学习_简单动态字符串

redis源码学习simple dynamic strings(简单动态字符串 sds)

redis源码学习simple dynamic strings(简单动态字符串 sds)

Redis2.6源代码走读第002课:简单动态字符串01

Redis源码分析01——简单动态字符串(sds)

Redis源码分析01——简单动态字符串(sds)