Redis的SDS的扩容策略之sdsMakeRoomFor扩容流程
2021-10-10 21:46:50 5 举报
Redis的SDS的拼接,涉及API sdscatsds(),其底层最终调用的是sdscatlen();由于其中可能涉及SDS的扩容,sdscatlen中调用sdsMakeRoomFor对带拼接的字符串s容量做检查,若无须扩容则直接返回s;若需要扩容,则返回扩容好的新字符串s。
作者其他创作
大纲/内容
开始扩容
否
是
重新申请内存
返回
1.释放原buf2.指向新buf地址3.设置新flags4.设置新内存的len长度
Redis的SDS的扩容策略: (1)若sds中剩余空闲长度avail大于等于新增内容的长度addlen,直接在柔性数组buf末尾追加即可,无须扩容。 (2)若sds中剩余空闲长度avail小于新增内容的长度addlen,则分情况讨论:新增后总长度len+addlen<1MB的,按新长度的2倍扩容;新增后总长度len+addlen>=1MB的,按新长度加上1MB扩容。 (3)最后根据新长度重新选取存储类型,并分配空间。此处若无须更改类型,通过realloc扩大柔性数组即可;否则需要重新开辟内存,并将原字符串的buf内容移动到新位置。
重置赋值alloc=newlen
len + addlen < 1M
type是否发生变化?
是(参考说明1)
移动原buf内容至新位置
参考说明3
realloc原buf
计算得到新type
newlen=(len+addlen) * 2
参考说明2
指向新buf地址
avail >=addlen
newlen=(len+addlen) + 1M
0 条评论
下一页