redis--简单动态字符串

简单动态字符串

Redis没有直接使用C语言传统的字符串表示,而是构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,将SDS用作Redis的默认字符串表示。

在Redis里边,C字符串只会作为字符串面量用在一些无需对字符串的值进行修改的地方。

1、SDS的定义

SDS的结构如下:

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

SDS遵循C字符串以空字符结尾的管理,保存空字符的一个字节空间不计算在SDS的len属性里面,并且为空字符分配额外的一个字节空间,以及添加空字符到字符串末尾等操作,都是由SDS函数自动完成的。

2、SDS与C字符串的区别

2.1、获取字符串长度

C字符串获取字符串的长度时需要遍历数组,而SDS只需要访问len属性即可;设置和更新SDS长度的工作是由SDS的API在执行时自动完成的。

2.2、杜绝缓冲区溢出

C语言字符串在执行cat操作时,需要预先预留并知晓目标字符的剩余空间,若剩余空间偏小,就会溢出,覆盖内存中的其他变量。而当SDS API需要对SDS进行修改时,API会先检查SDS的空间是否满足需求,如果不满足的话,API会自动将SDS的空间扩展至需要修改的大小,然后才执行实际的修改操作。

2.3、减少修改字符串带来的内存重分配次数

这种情形发生在,对字符串的append和trim操作中。

空间预分配
当SDS扩展空间的时候,遵循以下方法:

  • [ ] 如果SDS的len小于1MB,那么程序分配和len一样大小的未使用空间。
  • [ ] 如果SDS的len大于1MB,那么圣墟会分配1MB的未使用空间。

惰性空间的释放

当SDS剩余较多空间时,并不是马上释放掉,而是暂时保留,因为将来空间也可能增长;SDS中的API会在需要的时候,释放掉多余的空间。

2.4、二进制安全

C语言字符串必须符合某种编码,并且除了字符串的末尾以外,字符串中不允许出现结尾符,所以C字符串只能保存文本文件。而SDS的API都会以处理二进制的方式来处理存放在buf数组里的数据。

2.5、兼容部分C字符串函数

SDS的字符串也是遵循空字符结尾的规则。如strcasecamp函数,strcat函数等。

3、SDS API

函数 作用 时间复杂度
sdsnew 创建一个包含给定的C字符创的SDS O(N),n为给定的C字符串的长度
sdsempty 创建一个不包含任何内容的SDS O(1)
sdsfree 释放给定的sds O(N),n为被释放的SDS长度
sdslen 返回SDS的已使用的空间字节数 O(1)
sdsavail 返回SDS的我使用空间字节数 O(1)
sdsdup 创建一个给定的SDS的副本(copy) O(N),n为给定的SDS的长度
sdsclear 清空SDS保存的字符串内容 惰性空间策略,O(1)
sdscat 将给定的C字符串拼接到SDS字符串的末尾 O(N),n为拼接C字符串的长度
sdscatsds 将给定的SDS字符串拼接到另一个SDS字符串的末尾 O(N),n为被拼接字符串的长度
sdspy 将给定的C字符串复制到SDS里面,覆盖SDS原有的字符串 O(N),n为被复制的C字符串的长度
sdsgrowzero 用空字符将SDS扩展至给定长度 O(N),n为扩展新增的字节数
sdsrange 保留SDS给定区间内的数据,不在区间的数据会被覆盖或者清除 O(N),n为被保留的字节数
sdstrim 接受一个SDS和一个C字符串作为参数,从SDS左右两端分别移除所有在C字符串中出现过的字符 O(M x N),M为SDS的长度,N为C字符串的长度
sdscmp 对比两个SDS字符串是否相同 O(N),n为较短的那个SDS的长度
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • Redis SDS与C字符串区别 Redis没有直接使用C语言传统的字符串,而自己构建了一种简单动态字符串(Sim...
    binge1024阅读 1,501评论 0 0
  • 1、SDS redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dy...
    我要尝鲜阅读 347评论 0 1
  • Redis使用的是自己构建的简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将...
    但莫阅读 511评论 0 0
  • Redis没有直接使用C语言传统的字符串表示,而是构建了一种名为简单动态字符串(simple dynamic st...
    HRADPX阅读 378评论 0 0
  • 一、SDS介绍 Redis没有使用C语言传统的字符串表示(以空字符结尾的字符串数组,以下简称C字符串),而是自己构...
    Vic_is_new_Here阅读 3,206评论 0 1