首页 > 编程知识 正文

redis常用数据结构(redisobject)

时间:2023-05-05 15:13:34 阅读:92655 作者:1467

简单动态字符串(SDS ),简单动态字符串。 s也被称为hacking字符串。 hack处在sds中保存了字符串的长度和剩余的空间。 sds的实现在sds.c中。

c语言字符串使用长度为n 1的字符数组来表示长度为n的字符串。 此外,字符数组的最后一个元素始终为空字符' '。 这样存储的话,会有安全问题,无法满足效率的需要。

因此,Redis不使用c母语string,而是自己构建了SDS。 在Redis中,c语言字符串只用于日志等不需要更改字符串值的地方。

在Redis中,包含字符串值的键值对全部使用SDS实现,SDS也用于AOF缓冲区、客户端状态的输入缓冲区。

SDS定义

结构硬盘

//字节数组

卡尔巴赫;

//buf数组中使用的字节数

铟锡兰;

//buf数组中未使用的字节数

未完成;

(} )。

如上图所示,len表示SDS拥有不包含结束符的6字节字符串,free表示SDS还有6字节未使用的区域,buf是保存SDS中存储的字符串值的char型数组。

高效

与c语言字符串相比,将获取字符串长度的时间复杂度降低为o(1),并以c本机获取长度为o ) n )遍历整个数组。

安全

同时,SDS将缓冲器溢出归零,不像c那样排列数据安全,绝对不越界。

如果需要更改SDS,API首先检查SDS的当前可用容量是否满足更改后所需的容量,如果没有满足,API将自动将SDS的容量扩展到足够的容量,然后执行下一个操作,所以在SDS中不会发生缓冲区溢出问题

减少内存分配

C语言的字本机字符串的基础是使用n 1字符长度的char型数据实现的,因此每次扩展或缩短本机字符串时,程序都会对该字符串数组执行内存重新分配操作。

此外,重新分配内存涉及复杂的算法,需要执行系统调用,因此通常是一项耗时的操作。 Redis经常用于速度要求苛刻、数据频繁变更的情况,每次变更字符串时都需要重新配置存储器,会对性能产生很大的影响。

SDS在分配内存后(通常空间有多余)。 也就是说,是空间的预先分配。len和free可以保留已使用和未使用的内存,并独立于系统进行重新分区,从而有效地提高性能。

空间预分配

用于字符串的增加操作。 字符串增加后,程序首先检查是否需要扩展SDS空间。 如果需要扩展,程序不仅会为SDS分配修改所需的空间,还会为SDS分配其他未使用的空间。 其他未使用区域的公式如下:

更改

SDS空间 1MB

SDS后,如果SDS的长度(更改后的len属性的值)小于1MB,则将分配与SDS的len属性和free属性的值相同的len属性相同大小的未使用空间。 例如,如果修改后SDS的len变为10字节,程序将分配10字节的未使用空间,SDS的buf数组的实际长度为10 10 1=21。 n为了保存结束符,将再添加一个字节

更改

SDS空间 1MB

SDS后,如果SDS长度大于1MB,程序将分配1MB的未使用空间。 例如,如果修改后的len为10MB,程序将分配1MB的未使用空间,SDS的错误数组的长度为10MB 1MB 1byte

SDS空间 512MB

Game over~错误报告!

惰性空间释放

用于优化SDS的字符串缩小操作。 如果字符串缩小了,程序将使用free属性进行记录,以备将来使用,而不是立即执行内存重新分配来回收缩小后的可用内存。

的预先分配可以减少Redis连续执行字符串增长操作所需的内存重新分配次数,SDS通过释放非活动空间,避免了缩短字符串所需的内存重新分配操作,从而优化了未来的增长操作。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。