SDS 链表

sds定义

struct sdshdr{

int len

int free

char buf[]

}

sds和c语言类似,仍然把字符串的末尾加上一个‘、0’,但是不会计入总长度,也就是不会对len造成影响,属于默认的,对使用者来说是透明的

根据这个数据的定义,我们可以判断出sds和c字符串的区别

(1)获取len长度的时间复杂度不一样,一个是O(N),一个是O(1),

(2)杜绝缓冲区的溢出:对于c字符串,由于不会记录长度,所有可以造成溢出,比如我们说的strcat之类的,必须事先由使用者malloc出足够的空间,但是sds在追加的时候,会自动检查长度,如果长度不够的话,会自动扩展空间,类似vector,这样就杜绝了缓冲区溢出的情况

(3)减少了字符穿改变时候重新分配内部的次数,比如我们在c中,如果加长一个字符串或则缩短一个字符串的话,我们都需要重新分配空间但是sds对字符串的修改做了一些优化

sds字符串的冲分配优化

(1)空间预分配:如果增加字符串的时候,我们的空间不够用了,我们会重新分配,如果sds的长度小雨1MB,如果字符串的长度为len的话,我们我们将len=free=len,buf的长度为2×len+1

如果字符串大于1MB,那么我们的free设置为1mb,则buf=len+1mb+1

综上所述,我们可以减少redis字符串增加长度的分配次数

(2惰性空间释放):如果需要缩短字符串的话,我们不会将空间释放,而是将这些记录到free中,这样的话以以后可以使用

二进制安全:

c字符串只能保存文本,但是sds可以保存视频图片之类的二进制数据,不会因为遇到终止符而停止传输,因为sds是通过len的长度判断终止的,不是针对‘\0’

typedef struct list {

    // 表头节点
    listNode *head;

    // 表尾节点
    listNode *tail;

    // 链表所包含的节点数量
    unsigned long len;

    // 节点值复制函数
    void *(*dup)(void *ptr);

    // 节点值释放函数
    void (*free)(void *ptr);

    // 节点值对比函数
    int (*match)(void *ptr, void *key);

} list;s
上面就是链表的定义,根据定义我们可以总结几个特点1:双端:自带后置和前置节点,这样或者前后node的时间复杂度就是1,大大的降低了时间复杂度2:无环:第一个节点的前置和最后一个节点的后置指向的都是NULL,所以他不是一个环3:带有表头指针和表尾指针(见定义)4:带len:和sds类似,获得长度的时间复杂度为15:多态:节点通过上面三个void×类型的处理节点,复制,释放,对比,可以处理多种类型
typedef struct listNode {

    // 前置节点
    struct listNode *prev;

    // 后置节点
    struct listNode *next;

    // 节点的值
    void *value;

} listNode;
链表的应用地方很多,比如列表键的底层实现就是链表,链表的节点数据结构定义就是上面的定义,每一个节点都有一个前置后置指针,
时间: 2024-10-28 18:30:36

SDS 链表的相关文章

PHP开发程序员的学习路线

兄弟连PHP培训,简单为大家梳理了每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护:能够做基本的简单系统的PHP开发:能够在PHP中型系统中支持某个PHP功能模块的开发. 时间:完成本阶段的时间因人而异,有的成长快半年一年就过了,成长慢的两三年也有. 1.Linux 基本命令.操作.启动.基本服务配置(包括rpm安装文件,各种服

PHP程序员路线发展规划

阶段1:基础阶段(基础PHP程序员) 重点 把LNMP搞熟练(核心是安装配置基本操作) 目标 1. 能够完成基本的LNMP系统安装,简单的配置维护: 2. 能够做基本的简单系统的PHP开发 3. 能够在PHP中型系统中支持某个功能模块的开发 时间 因人而异 知识掌握 1.Linux: 基本命令.操作.启动.基本服务配置(包括rpm安装文件,各种服务配置等):会写简单的shell脚本和awk/sed 脚本命令等. 2.Nginx: 做到能够安装配置nginx+php,知道基本的nginx核心配置选

PHP程序员学习路线

第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护:能够做基本的简单系统的PHP开发:能够在PHP中型系统中支持某个PHP功能模块的开发. 时间:完成本阶段的时间因人而异,有的成长快半年一年就过了,成长慢的两三年也有. 1.Linux 基本命令.操作.启动.基本服务配置(包括rpm安装文件,各种服务配置等):会写简单的shell脚本和awk/sed 脚本命令等. 2.Nginx 做到能够安装配置nginx+

中高级PHP开发者应该掌握哪些技术?

中级PHP程序员 1.Linux 能够流畅的使用Shell脚本来完成很多自动化的工作:awk/sed/perl 也操作的不错,能够完成很多文本处理和数据统计等工作:基本能够安装大 部分非特殊的Linux程序(包括各种库.包.第三方依赖等等,比如MongoDB/Redis/Sphinx/Luncene/SVN之类的):了解基 本的Linux服务,知道如何查看Linux的性能指标数据,知道基本的Linux下面的问题跟踪等 2. Nginx:  在第一阶段的基础上面,了解复杂一些的Nginx配置:包括

【原创】PHP程序员的技术成长规划

PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:基础阶

PHP 程序员的技术成长规划

按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操

PHP程序员的技术成长规划

PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:基础阶

PHP程序员职业发展路线,适合你吗?

大自然的选择陪你说一世晚安男生PS教程自学平台纯文笑话 登录 部落管理 帮助 PHP程序员职业发展路线,适合你吗? 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言

好文章之——PHP系列(一)

注:最近实习的公司是一家做电商企业,后台主要是php开发,好久不怎么接触php的我看了几篇相关文章,提高下对它的认识与理解,发现里面的学习思路还是非常好的,当然也会重新拾一下基础知识啦! 其实自己心中还是有点小纠结的,感觉自己学的东西太杂了,没有非常精通的.毕竟人的精力是有限,举个例子:“如果1年干php,第二年又干java,第三年可能是Python.但是当第四年他可能想去找另外一份工作,那他到底要找什么样的工作呢? 每一种技能都不精,如果面试PHP,人家就按你php的水平给你薪水,而不太会看重