加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮南站长网 (https://www.0554zz.cn/)- 管理运维、图像技术、智能营销、专属主机、5G!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

Redis 中的 “SOS”

发布时间:2021-03-05 13:42:19 所属栏目:外闻 来源:互联网
导读:线上 OOM 的情况,相信大家也能从中学到一些东西,身为一名有追求的程序员,阿粉我的理解是光会吃老本是不行的,所以我一直也在学习,今天大家就跟我一起来了解一下 Redis 的 SDS 吧(不是 SOS 哦~)。 01、SDS 数据结构 Redis 底层是基于 C 语言来开发的,但

线上 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[],依次含义如下

  1. buf[]:字节数组,用于存放实际的字符串;
  2. len:记录 buf 数组中已经使用的字节数量,等同于 SDS 所保存的字符串的长度;
  3. free:记录 buf 数组中未使用的字节的数量。

表示一个存放了 'RED' 字符串,已经使用的长度为 3,未使用的长度为 2(这里用空白格表示未使用),其中的 '' 表示的是字符串的结束,不计算在 SDS 的 len 中,并且由 SDS 底层函数自动添加,对使用者来说是透明。这里统一采用空字符()结尾是为了复用 C 语言的相关函数。这个相信大家也很能理解,毕竟有祖宗可以靠,没必要全靠自己那么辛苦~。

02、为什么采用 SDS

2.1、SDS 与 C语言字符串的区别

在说明 Redis 为什么要自定义 SDS 之前,阿粉觉得我们应该先看一下 SDS 与传统的 C 语言的字符串有什么区别,知道了具体的区别我们才能知道这样实现的原因是什么。

2.1.1、O(1) 获取字符串的长度

传统的 C 语言字符串如果要获取字符串的长度,则需要遍历整个字符串,直到遇到 '' 字符,才知道整个字符串的长度是多少,操作复杂度是 O(n) 的。但是在 SDS 中,由于我们记录了字符串的长度,所以在获取字符串长度的时候是可以直接获取的,整个操作为 O(1)。

如上面的示例,我们可以直接获取字符串的长度是 3,而不需要遍历,另外字符串 Key 在 Redis 的底层实现就是采用 SDS 的,所以这个特性就保证了我们在计算 Key 的长度的时候不会出现任何瓶颈,对系统的性能不会有任何影响。

2.1.2、动态扩容

由于 SDS 中记录了未使用的空间大小,所以如果出现对已有字符串进行修改或者赋值时,SDS 底层函数会自动检测剩余空间是否能满足此次修改,如果


(编辑:淮南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读