len 已经使用空间长度free 未使用空间长度char[] buf 字符数组,保存数据,末尾和c语言字符串一样添加‘\0’
当数据小于1MB时,扩展数据,这个时候buf数组会产生一个和len长度一样的free空间, buf占用空间为 len + free + 1例如:'redis' buf占用6字节 'r','e','d','i','s','\0' 扩展之后增加 hello 占用21字节空间 buf数组为 'r','e','d','i','s','h','e','l','l','0','\0',null,null,null,null,null,null,null,null,null,null len 为 10 free 为 10
增加字符串"abcd" buf数组为 'r','e','d','i','s','h','e','l','l','0','a','b','c','d','\0',null,null,null,null,null,null len 为 14 free 为 6
当数据大于1MB时,扩展数据,这个时候buf数组最多产生1MB的free空间
例如:数据有10MB +10mb数据 空间占用20MB+1MB+1kb
buf数组为 'r','e','d','i','s','h','e','l','l','0','a','b','c','d','\0',null,null,null,null,null,nulllen 为 14free 为 6
去掉字符'e' buf数组为 'r','d','i','s','h','l','l','0','a','b','c','d','\0',null,null,null,null,null,null,null,null len 为 12 free 为 8 占用空间不变,同时redis提供释放空间API
因为c语言是根据空字符来判断末尾的,所以c语言的字符串不能包含'\0',SDS有len长度,可以避免这个问题,SDS是把所有数据都按照二进制来处理的
len 字符串长度
alloc 分配的空间长度
flags sds类型 5种类型 sdshdr5 sdshdr8 sdshdr16 sdshdr32 和 sdshdr64
buf[] 字节数组
根据数据大小判断哪一种SDS类型,节省空间