SDS

58 阅读1分钟

IO频繁的Redis 为什么选择不对齐呢

SDS 的指针并不是指向 SDS 的起始位置(len位置),而是直接指向buf[],使得 SDS 可以直接使用 C 语言string.h库中的某些函数,做到了兼容。如果不进行对齐填充,那么在获取当前 SDS 的类型时则只需要后退一步即可flagsPointer = ((unsigned char*)s)-1;相反,若进行对齐填充,由于 Padding(填充字符) 的存在,我们在不同的系统中不知道退多少才能获得flags,并且我们也不能将 sds 的指针指向flags,这样就无法兼容 C 语言的函数了,也不知道前进多少才能得到 buf[]。

什么是SDS

SDS简单动态字符串,是Redis自己定义的一套数据结构,用于实现String类型。

### SDS 与 C字符串比较

获取字符串长度复杂度 缓存区溢出和泄露:SDS 通过未使用空间解除了字符串长度和底层数据长度的关联,free/alloc,SDS实现了空间预分配和惰性空间释放两种优化的空间分配策略,解决了字符串拼接和截取的空间问题(分别导致缓存区溢出和泄露) 二进制安全:C字符串只能保存文本数据,不能保存像图片这样的二进制数据;而 SDS 的 API 会以处理二进制的方式来处理存放在 bu f数组里的数据,不会对里面的数据做任何的限制。

image.png