Redis 中的 “SOS”,不对,是 SDS
- 2020 年 2 月 12 日
- 筆記

大家好,我是鸭血粉丝(大家会亲切的喊我 「阿粉」),是一位喜欢吃鸭血粉丝的程序员,之前给大家总结了线上 OOM 的情况,相信大家也能从中学到一些东西,身为一名有追求的程序员,阿粉我的理解是光会吃老本是不行的,所以我一直也在学习,今天大家就跟我一起来了解一下 Redis 的 SDS 吧(不是 SOS 哦~)。
01、SDS 数据结构
Redis 底层是基于 C 语言来开发的,但是它没有采用 C 语言传统的字符串表示方式,而是自定义了一种叫做 SDS(Sample Dynamic String,简单动态字符串)的数据结构来表示字符串。传统的 C 语言的字符串是采用空字符( )作为结尾的字符数组,SDS 的数据结构稍微复杂一点,整个结构包含三个部分,是 Redis 的基础。(阿粉猜测这里就是传说中的青出于蓝而胜于蓝)。
1.1、数据结构
在源码 sds.h/sdshdr 结构体中定义了 SDS 的数据结构,包括三个部分,free,len,buf[],依次含义如下
- buf[]:字节数组,用于存放实际的字符串;
- len:记录 buf 数组中已经使用的字节数量,等同于 SDS 所保存的字符串的长度;
- free:记录 buf 数组中未使用的字节的数量。

image-20191015000650127
说明
上图中的 SDS 表示一个存放了 'RED' 字符串,已经使用的长度为 3,未使用的长度为 2(这里用空白格表示未使用),其中的 '