小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
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命令,也不会对系统性能造成任何影响