众所周知redis是由C语言实现的,包含有五种数据结构,跟别是string、list、set、hash以及sort_set,今天学习了关于string结构的底层涉及。
1、SDS的结构
redis的string结构,是对C语言的string结构进行了一层封装,可以称之为SDS(Simple Dynamic String 简单动态字符串)。
除了包括有基本的char[]数组buf之外,还包括有一个int类型的len(buf数组中已占用的字节数量),以及一个int类型的free(buf数组中未使用的字节数量)。
2、SDS设计的优点
a、获取字符串长度非常频繁,可以常数复杂度获取,提高读取效率;
b、在字符串反复set过程中,长度容易变化,如果len不满足新长度时会进行扩展,不会出现长度溢出;
3、SDS的其他机制
a、空间预分配
在长度增加时,首先会根绝len判断长度是否足够,如果不足时,则会进行扩展操作;
扩展并不是直接将buf扩展到指定长度,当长度len小于1MB时,扩展为len的两倍,即扩展后len=目标长度,且free也=目标长度;
当长度1>1MB时,会是的len=目标长度,free=1MB,即预留1MB的空间。
效果:这种预分配策略,SDS可以将连续增长N次字符串所需要的内存重分配次数,从必定N次降低为最多N次。
b、惰性空间释放
当SDS长度需要缩短时,程序不会立即使内存缩短,而是使用free属性将这些空间预留下来,等待接下来的使用,即不会释放内存。
效果:避免了缩短字符串带来的内存重新分配,并为将来可能的增长操作做了预留。
4、其他属性
a、二进制安全
所有的SDS API都会以处理二进制的方式来处理SDS存放在buf数组里的数据,程序不会对其进行任何限制或者过滤,数据写入时是什么样,读取就是什么样,保证了存储数据时的安全性。
b、兼容C字符串函数
虽然SDS API是二进制安全的,但是SDS依然可以复用String类型的一些库定义的函数。