Redis SDS 数据结构

2022/3/3 19:16:14

本文主要是介绍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类型,节省空间



这篇关于Redis SDS 数据结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程