Redis第一讲 Redis数据结构之简单动态字符串(SDS)

Redis底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。它们和数据类型的对应关系如下图所示:

OBJECT ENCODING    key 该命令是用来显示那五大数据类型的底层数据结构。

String数据结构类型

Redis使用了SDS作为默认的字符串表示,SDS是简单动态字符串(Simple Dynamic String)的缩写。SDS结构如下所示:

struct sdshdr {
	    int len;   //buf已使用的长度
	    int free;   //buf未使用的长度
	    char buf[];   //buf表示字节数组,用来存储字符串
	};
  •  Redis 为什么要重新定义SDS 去存储string呢?

1、c语言没有string类型, 只有char[],且char[]必须先分配空间长度;
2、获取char[]的长度,需要遍历数组,len(char[])时间复杂度O(n);
3、char[]预先分配了长度,数据增长后需要扩容;
4、c语言的char数组,用'\0'代表结束,意味着存储二进制数据不能包含'\0',图片音频等用二进制存储会有问题——这就是为什么Redis说自己实现的SDS是二进制安全的字符串。

  通过SDS的结构可以看出,buf数组的长度=free+len+1(其中1表示字符串结尾的空字符);所以,一个SDS结构占据的空间为:free所占长度+len所占长度+ buf数组的长度=4+4+free+len+1=free+len+9。  

4 字节的 len,可表示的字符串长度为 2^32-1,在实际应用中,存放于 Redis 中的字符串往往没有这么长,没有必要每个字符串都让 len 和 free 为 4 字节。

 简单动态字符串SDS,字符串对象的编码可以是int,raw或者embstr。

  1. int 编码:保存的是可以用 long 类型表示的整数值。
  2. raw 编码:保存长度大于44字节的字符串(redis3.2版本之前是39字节,之后是44字节),可分配多次内存空间
  3. embstr 编码:保存长度小于44字节的字符串(redis3.2版本之前是39字节,之后是44字节)存储简短字符串,一次的内存分配;它是只读的,如果对内容进行修改,就会变成raw编码(即使没超过44字节);
  • 关于redis3.2版本之前embstr转成raw的条件为什么长度是44?

首先这里要介绍下Redis的存储结构,其中所有对象都可以由redisObject结构来表示,可以参考我这篇博客:Redis第七讲 Redis存储模型详解

redisObject 占 16 个字节,当 buf 数组内的字符串长度是 39 时,sdshdr 的大小为 4+4+39+1&

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
SDS简单动态字符串)是Redis底层数据结构之一。它采用一段连续的内存空间来存储字符串,并具有一定的灵活性和扩展性。下面是一个展示SDS数据结构的例子: ``` typedef struct sdshdr { int len; // 已占用空间的长度 int free; // 剩余可用空间的长度 char buf[]; // 字符数组 } sdshdr; ``` 在这个例子中,我们可以看到SDS结构包含了`len`表示已占用空间的长度,`free`表示剩余可用空间的长度,以及`buf[]`表示字符数组。举一个实际的例子,如果我们要存储字符串"Redis",SDS会为其分配5字节的已使用长度,并为其分配5字节的可用空间长度。 与C字符串相比,SDS具有一些区别。C字符串的长度需要通过遍历整个字符串才能获得,而SDS可以直接通过`len`属性来获取字符串的长度。此外,C字符串是以空字符'\0'作为字符串的结束标志,而SDS通过`len`属性来确定字符串的长度,不依赖空字符。 在Redis中,C字符串主要应用在不需要对字符串值进行修改的地方,比如打印日志。而SDS主要应用在需要修改字符串值的地方,比如Redis的数据库中,包含字符串值的键值对在底层都是使用SDS来实现的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Redis底层数据结构——SDS](https://blog.csdn.net/weixin_39939725/article/details/110912176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值