Redis中Srting类型的底层实现-SDS

int free;
//存储字节的数组
int[] buf;
}

redis中用这种数据结构来保存string类型

2、为什么redis要用SDS来存储字符串?

c/c++ 中 char 数组也可以存储字符串,而且c就是这么干的, C 语言使用长度为 N+1 的字符数组来表示长度为 N 的字符串, 并且字符数组的最后一个元素总是空字符 ‘\0’ 。

我们分析一下以下几种情况char数组和sds的区别:

2.1. 长度的获取。

c中字符串长度获取需要遍历char数组,时间复杂度是O(n)

sds直接记录了字符串的长度,所以长度获取的时间复杂度是O(1)

2.2. 缓冲区溢出(buffer overflow)

除了获取字符串长度的复杂度高之外, C 字符串不记录自身长度带来的另一个问题是容易造成缓冲区溢出(buffer overflow)。 <string.h>/strcat 函数可以将 src 字符串中的内容拼接到 dest 字符串的末尾,当dest拼接的src的长度超过自身分配的地址大小时,就会修改到别的地址,造成缓冲区溢出。

SDS 的空间分配策略完全杜绝了发生缓冲区溢出的可能性: 当 SDS API 需要对 SDS 进行修改时, API 会先检查 SDS 的空间是否满足修改所需的要求, 如果不满足的话, API 会自动将 SDS 的空间扩展至执行修改所需的大小, 然后才执行实际的修改操作, 所以使用 SDS 既不需要手动修改 SDS 的空间大小, 也不会出现前面所说的缓冲区溢出问题。

2.3. 空间预分配

空间预分配用于优化 SDS 的字符串增长操作: 当 SDS 的 API 对一个 SDS 进行修改, 并且需要对 SDS 进行空间扩展的时候, 程序不仅会为 SDS 分配修改所必须要的空间, 还会为 SDS 分配额外的未使用空间。

其中, 额外分配的未使用空间数量由以下公式决定:

如果对 SDS 进行修改之后, SDS 的长度(也即是 len 属性的值)将小于 1 MB , 那么程序分配和 len 属性同样大小的未使用空间, 这时 SDS len 属性的值将和 free 属性的值相同;

如果对 SDS 进行修改之后, SDS 的长度将大于等于 1 MB , 那么程序会分配 1 MB 的未使用空间。

举个例子: 如果进行修改之后, SDS 的 len 将变成 13 字节, 那么程序也会分配 13字节的未使用空间, SDS 的 buf 数组的实际长度将变成: 13 + 13 + 1 = 27 字节(额外的一字节用于保存空字符)。

最后

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

![2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多](https://upload-images.jianshu.io/upload_images/24616006-6ad26b56a851bd 需要zi料+ 绿色徽【vip1024b】

bd?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Java核心知识

  • Spring全家桶(实战系列)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 其他电子书资料

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多
一点。

以下是我私藏的面试题库:

[外链图片转存中…(img-Lrs8cuLj-1710365047060)]

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值