SDS:simple dynamic String
优势:
1.提升效率,C语言的字符串如果需要知道字符串的长度,需要遍历,复杂度是O(n),而针对SDS,复杂度是O(1)
2.杜绝缓冲区溢出。concat操作,C会直接在后面追加,这样就有可能在紧连着的字符串中导致后续的字符串被冲,而SDS在会检查是否有足够空间用于concat,没有的话则执行自己的API进行空间拓展
3.减少修改字符串带来的内存重分配次数。每次内存分配涉及复杂的算法,可能会涉及到系统调用,所以是一个比较耗时的操作。一般程序中,修改字符串的情况不太多,所以可以接受,但是redis作为数据库,经常被用于速度快,修改快的场景中,为了解决这个问题,redis使用SDS来解决。
4. 二进制安全。SDS使用len的属性值判断是否为空,而不是判断特殊字符。
SDS通过free,实现了空间预分配以及惰性空间释放
1. 空间预分配。对SDS进行修改之后,如果长度小于M,则分配与len属性相同的大小作为free,如果大于1M,则分配1M。这种策略使得内存分配次数从必定N次降低为最多N次。
2. 惰性空间释放。如果释放空间,仅仅移除字符串,并不触发内存重新分配。