因为 SDS 维护了一个 len 字段,这个字段的设置和更新是由 SDS 的 API 在执行时自动完成的。
在使用 c 语言函数 strcat(s1, " Cluster") (在 s1 字符串后面拼接另一个字符串) 时,如果忘记提前为 s1 分配足够的空间,那么 strcat 函数执行之后, 将会导致s1后面的空间内容被意外修改。
而 Redis 在对 SDS 修改时,会提前检查长度时候足够,才执行相关操作, 如果长度不够,会先扩展 s 的空间, 再执行
在 SDS 维护了 free 字段,可以知道未使用的字节数,这样在动态扩充字符串时可以根据这个值判断要不要重新分配内存
C语言是依靠 \0 作为字符串的结束标志的,这意味着字符串中间不能再次包含 \0 字符, 而 SDS 记录了字符串的实际长度, 所以它可以做更多的事情, 比如保存图片
虽然 SDS 是 二进制安全的,但他们都遵守在字符串末尾额外分配一个字节容纳 \0 当结尾,这就是为了让那些保存文本数据的 SDS 可以重用 库
当保存的值为整数且值的大小不超过long的范围,使用整数存储
当字符串长度不超过44个字节时,使用embstr编码
(只实现一次分配内存空间,只允许读,若修改数据,就会转成raw编码)
大于44字节时,用raw编码
这么做的原因当然是为了性能考虑,Redis考虑到多数字符串,可能都不会很长, 这样使用 embstr 只需分配一次内存(也很小),而且还是连续的存储,性能很高,也有利于减少内存碎片String编码演示
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |