一、数据结构
string
Redis字符串是可修改字符串,在内存中以字节数组形式存在。
下面是string在源码中的定义,SDS(Simple Dynamic String)
struct SDS<T> {
T capacity; // 数组容量
T len; // 数组长度
byte flags; // 特殊标识位,不理睬它
byte[] content; // 数组内容
}
Redis规定字符串的长度不超过512M。
Redis字符串的两种存储方式:
- 长度特别短,使用emb形式存储
- 长度超过44,使用raw形式存储
扩容策略
字符串长度小于1M之前,扩容采用加倍策略,保留100%的冗余空间。(从源码中可以看到是现有的数组长度len+设定的容量大小capacity)
字符串长度超过1M后,每次扩容只多分配1M大小的冗余空间。
sds sdscatlen(sds s, const void *t, size_t len) {
size_t curlen = sdslen(s); // 原字符串长度
// 按需调整空间,如果 capacity 不够容纳追加的内容,就会重新分配字节数组并复制原字符串的内容到新数组中
s = sdsMakeRoomFor(s,len);
if (s == NULL) return NULL; // 内存不足
memcpy(s+curlen, t, len); // 追加目标字符串的内容到字节数组中
sdssetlen(s, curlen+len); // 设置追加后的长度值
s[curlen+len] = '