redis源码解析(一):sds字符串

引言

redis并没有像c语言那样使用\0作为结尾的字符串直接使用,而是再c语言的字符串之上重新封装了一个名叫sdshdr的数据结构,用于存储数据。

使用sds字符串的好处

(1)以o(1)的时间复杂度获取字符串的长度

redis在自己定义的字符串数据结构中使用一个len字段用来表明sds所存储的字符串的长度,当需要获取字符串长度的时候可以直接调用sdslen()函数直接获取字符串长度。

(2)减少对字符串进行增删操作导致的内存重新分配所带来的额时间消耗

sds字符串在创建的时候redis不会为其分配多余的空间,但是当对sds字符串进行增长操作后,sds字符串就会通过分配多余的空间来减少下次字符串分配时进行重新内存分配所需要的时间。
分配规则如下图所示(+1是因为字符串末尾有\0作为结束符)。
sds字符串分配空间的规则

(3)复用c语言自己的库中的函数,减少代码量

sds字符串会在字符串的末尾加上\0用来表示字符串的结尾,这种规则是c语言字符串的惯例,因此在使用sds字符串的时候可以重用c语言<string.h>库中的函数,减少代码量。

(4)二进制安全,可以用来存储音频、视频、压缩文件等二进制数据

c语言字符串中除了末尾不能出现\0,不然字符串内部出现的\0会被认为是字符串的结尾。这个特性使得c语言字符串无法保存二进制数据(视频、音频、图片等)。但是sds字符串将所有存储的字符串默认为二进制数据,数据在写入的时候怎么样,数据读取出来依旧不变。

sds字符串的具体实现

我们首先来看看字符串的定义:
sds字符串的定义
字符串工作流程如下(先创建"hi"字符串后再在末尾加入“ redis”,最后删除”dis“ ):
创建"hi"
再加入" redis"
加入" redis"
接着删除"dis"
删除"dis"
redis在末尾加入的\0空字符对用户来说完全透明,使得我们的编程更加简便。

sds字符串主要api说明

sds主要api
sds主要api

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值