Redis设计与实现笔记之SDS

news/2024/11/2 17:37:31/

1 数据结构与对象

1.1 简单动态字符串

SDS简单动态字符串(simple dynamic string,SDS)是Redis中字符串的底层数据结构。

    struct sdshdr {// 记录 buf 数组中已使用字节的数量// 等于 SDS 所保存字符串的长度int len;// 记录 buf 数组中未使用字节的数量int free;// 字节数组,用于保存字符串char buf[];};

底层数据结构遵循C语言中空字符"\0"结尾。

数据结构三个属性分别代表存储字节的数组buf,数组中存储字符的长度len,数组空闲长度free

注意保存\0的字符串并不占用len的长度。并且会为\0空字符分配额外一字节空间。

遵循空字符结尾这一惯例的好处是, SDS 可以直接重用一部分 C 字符串函数库里面的函数。

以下是C语言中的字符数组与SDS的区别

1.1.1 获取字符串长度时间复杂度

SDS计算字符串长度的时间复杂度是O(1),C语言需要遍历数组计算长度时间复杂度为O(n)

1.1.2 缓冲区溢出

C语言中strcat的执行会导致缓冲区溢出。但SDS由于记录了字符串长度,sdscat在拼接字符串前会先检查SDS中的buf数组空间是否足够,不足的时候会先扩容buf,再执行拼接工作。

1.1.3 减少字符串修改时内存重分配次数

SDS中未使用空间可以减少字符串修改时,内存的重分配次数。

1.1.4 空间预分配

SDS被修改后,如果SDS的长度小于1MB,那么程序将分配len长度的空闲空间。例如len为20字节,那么同样分配20字节的free空间。

SDS被修改后,如果SDS的长度大于1MB,那么程序将分配1MB长度的free空闲空间。

1.1.5 惰性空间释放

SDS修改时,字符串的缩短并不减少buf实际长度,而是将增加字符串的free的长度。

但是SDS也提供真正缩短字符串的API

1.1.6 二进制安全

C语言中,字符数组不能包含空字符,会被识别为字符串结尾。因此C语言的字符数组只能保存文本数据。

但SDS中不对数据内容做限制,SDS存放的是二进制数据,因此SDS中叫buf为字节数组。SDS中通过len的参数来判断数据的结尾。而不是\0字符。这也保证了SDS的二进制安全

1.1.7 兼容部分c语言中的字符串函数

SDS也通过在数组最后存放\0字符来兼容C语言中的字符串函数。

例如:strcasecmp,strcat

C 字符串SDS
获取字符串长度的复杂度为

获取字符串长度的复杂度为

API 是不安全的,可能会造成缓冲区溢出。API 是安全的,不会造成缓冲区溢出。
修改字符串长度 N 次必然需要执行 N 次内存重分配。修改字符串长度 N 次最多需要执行 N 次内存重分配。
只能保存文本数据。可以保存文本或者二进制数据。
可以使用所有 <string.h> 库中的函数。可以使用一部分 <string.h> 库中的函数。

http://www.ppmy.cn/news/691138.html

相关文章

android设置移动联通电信wap接入点

原文&#xff1a;android设置移动联通电信wap接入点 源代码下载地址&#xff1a;http://www.zuidaima.com/share/1550463755242496.htm android设置移动联通电信wap接入点 java项目截图

2020移动apn接入点哪个快_手机WiFi网速度太慢?教你一招网速翻倍好用,比5G还快...

手机WiFi网速慢似蜗牛速度&#xff0c;出现这样的情况时&#xff0c;不要怀疑是你的WiFi有问题&#xff0c;其实只是你的手机不会设置&#xff0c;导致在连接WiFi使用手机时网速非常缓慢。下面就教大家一招快速提升网速&#xff0c;让你的手机瞬间流畅。 方法一&#xff1a;iPh…

联通5g接入点设置参数_手机网速慢可以这样设置,网速瞬间飙升,还不知道真是可惜了...

不管是在家或者出门&#xff0c;相信大家都会遇倒网速突然变慢的问题&#xff0c;可能有些小伙伴会以为是5G出来了&#xff0c;所以4G给限速了&#xff0c;其实不是的&#xff0c;在过去一年&#xff0c;4G用户就提升了近一倍&#xff0c;但是基站并没有提升这么多呀&#xff0…

2020移动apn接入点哪个快_为什么都是4G网你的就没别人快?跟我这样设置,网速直线提升...

想必很多朋友都遇到过&#xff0c;在同一个地方手而且都是4G网&#xff0c;手机网速却没有别人的快&#xff1f;这个问题最直观的表现就是&#xff0c;两个人坐在一起开黑玩游戏&#xff0c;有个人网速流畅&#xff0c;但是另一个却卡的掉线。那么这个究竟是什么导致的呢&#…

移动接入安全

移动接入概述 1.需求背景 1.1、移动办公/远程办公已成常态 移动/远程办公拓展了组织网络边界 让组织更充分的利用互联网 让组织的信息化建设发挥更大价值 1.2、移动接入成为企业信息安全的短板 开放远程接入&#xff0c;让企业构建的安全边界失去作用 互联网更为复杂的…

Android 移动网络接入点名称(APN)

系统环境&#xff1a;Android 5.1&#xff0c;MTK平台 位置&#xff1a;设置-更多-移动网络-接入点名称&#xff08;APN&#xff09; Activity名称&#xff1a;com.android.settings/com.android.settings.Settings$ApnSettingsActivity 物联网第三方业务平台通用APN为CMMTM&am…

电信接入点服务器修改,修改apn加快电信4g网速(电信最佳apn接入点)

您好 电信4G网络的带宽可以达到150M,一般使用电信4G网络时接入点可以选择ctlet,详情请登陆电信网上营业厅查看。 您好!您先进入手机的接入点设置--新建apn接入点--名称乱填,apn:cmtds--保存 保存之后,选择自己刚刚设置的接入点,然后您就会发现您自己的手机4G网络的速度很…

移动apn接入点哪个快_2020年北京移动电信联通校园卡5G网速究竟有多快?

今年北京三家运营商的校园卡套餐均支持5G网络,目前5G覆盖的地方也越来越多了,基本上一些地级市均已完成覆盖了,更不用说北京5G网络的覆盖程度了,大家如果想看自己所处的位置是否有5G覆盖,可以下载对应运营商的手机营业厅,可以查看到5G覆盖的范围。那么5G网速究竟有多快呢…