Redis-动态字符串(SDS)

696 阅读2分钟

Redis数据库里面的每个键值对(key-value pair) 都是由对象(object) 组成的

  • 数据库键(key) 总是一个字符串对象(string object)
  • 数据库值(value) 对象类型可以是:
    • string object
    • list object
    • hash object
    • set  object
    • sorted set object 
    • ......

今天我们主要来说一说字符串对象,在Redis中,字符串的结构是做了特定的设计,兼容C语言标准字符串处理函数,同时在此基础上也保证了二进制安全。在Redis中用SDS(简单动态字符串- Simple Dynamic String)作为Redis字符串结构。

SDS的结构包括哪些?

首先需要一个字符串指针,同时为方便上层接口调用,提供了一些可以快速获取字符串结构中的一些统计信息,每个字符串本身都会以 ‘\0’表示字符串的结束,比如:

  • 字符串长度
  • 剩余容量
  • ......

image.png

image.png

Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。但是这个key使用的结构,都是字符串类型。

SDS与C字符串的区别有哪些

看两张图,第一张是C字符串,第二张是Redis字符串:

image.png

image.png

有以下几点区别:

  • 获取字符串长度C字符串的复杂度为O(N),而SDS的复杂度为O(1)

  • 杜绝缓冲区溢出(C语言每次需要手动扩容),如果C字符串想要扩容,在没有申请足够多的内存空间下,会出现内存溢出的情况,而SDS记录了字符串的长度,如果长度不够的情况下会进行扩容。

  • 减少修改字符串时带来的内存重分配次数

    • 空间预分配,规则1:修改后长度< 1MB,预分配同样大小未使用空间,free=len;规则2:修改后长度 >= 1MB,预分配1MB未使用空间

    • 惰性空间释放