Redis数据结构之SDS

194 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

Redis数据结构之SDS

SDS是redis的默认字符串的表示

sds.h中有sds的结构定义

// sdshdr 结构
struct sdshdr {

    // buf 已占用长度
    int len;

    // buf 剩余可用长度
    int free;

    // 实际保存字符串数据的地方
    // 利用c99(C99 specification 6.7.2.1.16)中引入的 flexible array member,通过buf来引用sdshdr后面的地址,
    // 详情google "flexible array member"
    char buf[];
};

redis中键值对的键是一个字符串对象,对象的底层使用的保存了字符串的SDS,值同样也是对应value的字符串的SDS

SDS与C字符串的区别:

获取字符串长度复杂度O(1)

获取C字符串的长度,程序必须遍历整个字符串,对遇到的每个字符进行计数,直到遇到代表字符串结尾的空字符为止,这个操作的复杂度为O(n)

而SDS记录在len属性中记录了SDS本身的长度,所有获取SDS长度的复杂度为O(1),

设置和更新SDS长度的工作由SDS的API在执行时自动完成的,使用SDS无需进行手动修改长度的操作

通过使用SDS而不是C字符串,Redis将获取字符串长度所需要的复杂度从O(n)降低到了O(1),确保了获取字符串长度的工作不会成为redis的性能瓶颈,因此我们对一个非常长的字符串键反复执行执行STRLEN命令,也不会对系统性能造成任何影响