2.简单动态字符串

2.1 SDS的定义

SDS的结构体:

int len//记录buf数组中已使用字节的数列

int free;//记录buf数组中未使用字节的数列

char buf[];//字节数组,用于保存字符串

2.2 SDS与C字符串的区别

2.2.1 常数复杂度获取字符串的长度:

C语言字符串获取长度时间复杂度为O(n)

2.2.2 杜绝缓冲区溢出

C字符串不记录自身长度,会造成缓冲区溢出

在对SDS进行修改时,API会检查SDS对空间是否满足修改所需对有求,如果不满足,API会自动将SDS的空间扩展至执行修改所需的大小,然后才执行所需的修改操作

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

1.空间预分配

用于优化SDS字符串增长操作:当一个API对SDS进行修改,并且需要对SDS对空间进行扩展的时候,程序不仅会为SDS分配修改所必须要的空间,还会为SDS分配额外的未使用空间

当SDS的长度小于1MB,程序分配和len属性同样大小的未使用空间

当SDS的长度大于等于1MB,程序会分配1MB的未使用空间。

2.惰性空间释放

用于优化SDS字符串缩短操作:当SDS的API需要缩短SDS保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而是使用free属性将这些字节的数量记录起来,并等待将来使用。

2.2.4 二进制安全

C字符串只能存储文本数据

Redis不是使用buf来保存字符,而是用它来保存一系列二进制数据

2.2.5 兼容部分C字符串函数

可以重用一部分库定义的函数

3.链表

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度

链表键、发布与订阅、慢查询、监视器等功能也用到来链表

3.1 链表和链表节点的实现

listnode{

listnode *head;

listNode *tail;

unsigned long len;

void *(*dup)(void *ptr);

void (*free)(void *ptr);

int (*match)(void *ptr, void *key);

}

Redis链表实现特性:

双端:prev指针,获取当前节点的前置节点,next指针,用来获取当前节点的后置节点

无环:表头节点的prev指针和next指针都指向NULL,对链表的访问以NULL为终点

带有表头节点和表尾节点指针:通过list的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)

带链表长度计数器:程序使用list结构的len属性来对list持有的链表节点进行计数,程序获取链表长度的时间复杂度为O(1)

多态:链表节点使用void*指针来保存节点值,可以通过dup,free,match为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站...
    Java架构阅读 1,276评论 1 16
  • 转载:可能是目前最详细的Redis内存模型及应用解读 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据...
    meng_philip123阅读 1,424评论 1 22
  • 人间从来都值得,不值得的,只有你我。两个月了,还是不能控制自己想你,我一直觉得自己是个足够冷漠的人,即使面对生死别...
    001lm阅读 230评论 0 0
  • 戏说水浒全目录 上回我们说到,那扈三娘正一边鞭挞着夫君矮脚虎、一边口中强调着“只是干妹妹”的时候,黑旋风李逵迈步走...
    这是文阅读 1,901评论 0 3
  • 第四章 玄幻门正是因为它的虚幻而得名,除了岛主黄芪外,无论谁进入后出来都会变成两个人,其中一真一假。只有黄芪才能辨...
    墨存啊阅读 267评论 0 1