Redis之String的底层实现(SDS全方位讲解)

Redis的String类型采用SDS(Simple Dynamic String)优化,而非C字符串。SDS提供常数时间获取长度、避免缓冲区溢出、减少内存重分配次数、二进制安全及兼容C字符串函数等优势。其结构包括len记录字符串长度,free记录未使用空间。空间预分配和惰性空间释放策略有效提高性能。
摘要由CSDN通过智能技术生成

前言:

我们知道的是对于redis来说 其相比于memcached而言其中的一个优点就是数据数据结构来说 ,reids有五种数据结构来实现各种不同的操作,所以运用也就更加广泛些,其中对于String类型来说,Redis就对其底层进行了一个优化的梳理,不再是简单的使用C中的字符,而是使用到了一个全新的数据结构 SDS。本节我们就先来介绍一下SDS,来揭开他的真实面纱。

定义学习

既然要学习到一个新的数据结构,那我们先来看看结构的定义是怎样的:

结构定义:
struct sdshdr{
   
int len;// 用于记录buf数组中已经使用的字节的数量,也等于SDS所保留的字符串的长度。
int free;// 记录buf数组中未使用的字节的数量。
int free; // 字节数组,用于保存字符串。
}

可能在看完结构的定义以后大家还是有点懵的,那么有图有真相:
在这里插入图片描述如上图所示,下面我们来进行具体的介绍:

  • free属性的值为0,表示这个SDS没有分配任何未使用空间。
  • len属性的值为5,表示这个SDS保存了一个五字节长的字符串。
  • buf属性是一个char类型的数组,数组的前五个字节分别保存了’R’、‘e’、‘d’、‘i’、‘s’五个字符,而最后一个字节则保存了空字符’\0’。

了解完了基础的结构以后,其实对于SDS还是和我们基本的C字符有很大的相似的地方:保留了空字符结尾的惯例,也会保留空字符的1自己空间并不计算在SDS的len属性里面,并且为空字符分配额外的1字节空间,以及添加空字符到字符串末尾等操作,都是由SDS函数自动完成的,所以这个空字符对于SDS的使用者来说是完全透明的。

作用讲解

前面有讲到 对于SDS还有一个free变量的存在表示“未使用的空间的大小” 可能是如下的状态:
在这里插入图片描述
此时就会有五个空间是空闲下来未被使用到的。
下面我们就来讲解为什么对于Redis来说不使用现成的C类型的字符而偏偏要使用SDS。

常数复杂度获取字符长度

我们都知道对于一个C字符串来说并不会记录自身的长度,所以在获取长度的时候就需要对整个字符进行一个遍历,直到遇到代表字符串结尾的空字符为止,这个操作的复杂度为O(N)

RedisString是基于SDS(Simple Dynamic String实现的,SDSRedis自己实现的一个字符串类型。SDS和C语言的字符串一样,是一块连续的内存空间,但是它还增加了一些其他的信息,比如它的长度、当前已使用的空间和总空间等。SDS结构如下: ```c struct sdshdr { int len; //字符串长度 int free; //未使用空间长度 char buf[]; //字符串内容 }; ``` RedisString底层主要是通过SDS实现的,String的操作都是通过SDS的相关函数实现的,如: - set:创建一个SDS,将需要存储的字符串拷贝到SDS,并返回一个指向SDS的指针。 - get:根据输入的key,查找对应的SDS,并返回它的指针。 - append:根据输入的key和value,查找对应的SDS,将value追加到SDS的尾部,同时更新SDS的长度和未使用空间的长度。 - incr:根据输入的key,查找对应的SDS,将SDS存储的数字加上输入的值,然后将新的数字转换成字符串再存储回SDS。 - decr:和incr类似,只是将SDS存储的数字减去输入的值。 - setrange:根据输入的key和offset,查找对应的SDS,在SDS从offset开始替换指定长度的字符串。 - getrange:根据输入的key、start和end,查找对应的SDS,返回该SDS的子字符串。 - strlen:根据输入的key,查找对应的SDS,返回该SDS的长度。 综上所述,RedisString底层主要是通过SDS实现的。在SDS的基础上,Redis提供了一些方便数据操作的接口,使得开发者可以更加方便地进行数据存储和操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值