redis SDS 3.0
len 已经使用空间长度free 未使用空间长度char[] buf 字符数组,保存数据,末尾和c语言字符串一样添加‘\0’
1.空间预分配
当数据小于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
2.惰性空间释放
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
3.二进制安全
因为c语言是根据空字符来判断末尾的,所以c语言的字符串不能包含'\0',SDS有len长度,可以避免这个问题,SDS是把所有数据都按照二进制来处理的
redis sds 3.2 之后
len 字符串长度
alloc 分配的空间长度
flags sds类型 5种类型 sdshdr5 sdshdr8 sdshdr16 sdshdr32 和 sdshdr64
buf[] 字节数组
根据数据大小判断哪一种SDS类型,节省空间
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。