Redis-数据结构-SDS、链表

一、简单动态字符串 SDS(simple dynamic string)

1、redis中使用SDS作为默认字符串表示,C字符串只会作为字符串字面量使用(无须对字符串值进行修改,如打印日志)

2、定义

3、SDS与C字符串的区别

    3.1、常数复杂度获取字符串长度

            SDS在len属性中记录了字符串的长度,获取SDS长度的算法复杂度为O(1)

    3.2、杜绝缓冲区溢出

            SDS的API会自动检查空间,不需要手动分配内存,杜绝了缓冲区溢出的可能

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

            SDS 通过未使用空间(free属性)解除了字符串长度和底层数组长度之间的关联:buf数组的长度不一定是字符串长度+1,buf数组可以包含未使用的字节,这些字节数量由free属性记录

            SDS通过未使用空间,实现了空间预分配和惰性空间释放两种优化策略

                    3.3.1 空间预分配

            通过预分配策略,SDS将连续增长N次字符串所需内存重分配次数从必定N次降低为最多N次

                    3.3.2、惰性空间释放

                用于优化SDS字符串缩短操作,使用free属性记录释放的空间,在需要真正释放空间的使用再对buf数组进行操作

     3.4、二进制安全(支持二进制数据)

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


4、

        4.1、与Java StringBuilder类对比,StringBuilder 继承抽象类 AbstractStringBuilder

二、链表

1、实现结构

        1.1、链表节点

        1.2、链表

2、特性

                2.1、双端:带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)

                2.2、无环:表头节点的prev和表尾结点的next指针都指向NULL,对链表的方位以NULL为终点

                2.3、带有表头指针和表尾指针

                2.4、带有链表长度计数器

                2.5、多态:链表节点使用 void*指针保存节点值,可以保存各种不同类型的值

3、链表主要用于实现链表键、发布订阅、慢查询(?)、监视器(?)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站...
    Java架构阅读 1,299评论 1 16
  • 转载:可能是目前最详细的Redis内存模型及应用解读 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据...
    meng_philip123阅读 1,456评论 1 22
  • 转载:可能是目前最详细的Redis内存模型及应用解读 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据...
    jwnba24阅读 640评论 0 4
  • 真正要传民族文化,就要大大方方地当爸爸妈妈,让孩子直接读经典。要弄清楚到底哪一部经是真经。 贫穷不是社会主义,精神...
    冰冰_489d阅读 145评论 0 0
  • 支教 暑假去了粤北一个乡镇支教去了,这个强度比以往参加的活动都要大,感觉像是连续两周,每天参加活动。支教生活虽物质...
    安灯阅读 185评论 0 0