SDS结构:
len:记录字符串的长度,可以直接获取字符串的长度,时间复杂度为O(1).
alloc:分配给字符数组的空间长度,可以通过alloc-len获得剩余的空间大小,来判断空间是否满足修改需求,如果不满足,就自动将SDS的空间扩展到需要修改的大小,然后执行相应的修改操作,不会出现缓冲区溢出的问题。
flags表示不同的类型的SDS,有5种:sdshdr5 sdshdr8 sdshdr16 sdshdr32 sdshdr64;
buf[]:存储实际的数据,既可以字符串,也可以保持二进制
相比C语言的字符串优点:
1.获取字符长度时间复杂度为O(1)
2.二进制安全,可以存储包含\0的数据。
3.不会发生缓冲区溢出。c语言大多数函数追加字符串都是不安全的,这些函数把缓冲区大小是否满足操作需求的工作交给开发者来保证,程序内部不会判断缓冲区大小是否够用,如果发生缓冲区溢出就可能造成程序异常结束。
redis引入alloc和len变量,这样通过alloc-len计算剩余的空间大小。判断缓冲区大小是否够用;当缓冲区大小不够用时,redis会自动扩大sds的空间大小(小于1M翻倍扩容,大于1M就按照1M扩容)来满足所需要的大小。从而减小内存分配次数。
4.节省内存空间,根据flags灵活存储不同大小的字符串,从而有效的节省内存空间。