Last updated
Last updated
redis
中对 string
值的存储,并没有使用C中的 char*
,而是使用了 SDS (simple dynamic string)
SDS
结构类似 Go
里的切片,有 3
个字段,总长度 alloc
(类似 capacity
),已用长度 len
,以及实际字符串数组 char*
相对于 C
的 char*
,有如下优势:
二进制安全的(不用原字符串 + \0
的方式表示结束)
能在 O(1)
的时间获取字符串长度
预留了额外空间,追加字符串时可能不需要重新分配空间;(惰性释放,内存紧张时也会释放)
SDS
的实现有 2
种,在长度特别短时,使用 embstr
形式存储,而当长度超过 44
字节时,使用 raw
形式存储。
两者其实都是header
+ char*
的组合。
embstr
比 raw
少一次内存空间分配,它把 header
和 字符串保存在同一块连续的内存里了。而 raw
要申请额外内存保存字符串。
为啥是
44
字节?
64
字节,减去RedisObject
头信息19
字节,再减去3
字节SDS
头信息,再减去\0
结尾,这样最后可以存储44
字节。
新字符串长度 = (原有长度 + 新长度)+ 预分配空间
预分配空间的算法如下: