Redis字符串SDS设计

2018-03-07  本文已影响0人  Chasiny

redis数据库底层没有直接使用c的字符串表示,而是自己使用名为简单动态字符串(simple dynamic string,SDS)


SDS定义

struct sdshdr{
    int len;       //记录buf数组中以使用字节的数量,等于SDS所保存字符串的长度
    int free;      //记录buf数组中未使用字节的数量
    char buf[];    //字节数组,用于保存字符串 
}

示例


image.png

SDS与C字符串的区别

1. 获取字符串长度时间复杂度不同(提高获取字符串长度性能)
2. SDS杜绝缓冲区溢出
3. 减少修改字符串带来的内存重分配次数

1.空间预分配

  • 如果对SDS修改后,SDS的长度(len)<1MB,则程序将分配和len属性同样大小的free空间
  • 如果对SDS修改后,SDS的长度(len)>1MB,则程序将分配1MB的free空间

2.惰性空间释放

  • 惰性空间释放用于优化SDS缩短的操作,当SDS缩短时,程序不会立即进行内存重新分配,而是用free保存多余出来的字节,方便未来使用
4.二进制安全
5.兼容部分C字符串函数
总结
C字符串 SDS
获取字符串长度复杂度为O(N) 获取字符串长度复杂度为O(1)
API是不安全的,可能造成缓冲区溢出 API是安全的,不会成缓冲区溢出
修改字符串长度N次必然需要执行N次内存重新分配 修改字符串长度N次最多需要执行N次内存重新分配
只能保存文本数据 可以保存文本数据和二进制数据
可以使用所有<string.h>库中的函数 可以使用部分<string.h>库中的函数
上一篇下一篇

猜你喜欢

热点阅读