微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Redis SDS 数据结构

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] 举报,一经查实,本站将立刻删除。

相关推荐