redis 数据结构 简单动态字符串和链表

假期在家,看了《Redis 设计与实现》,将其整理成了md。
想来,有两个月左右没有写博客了,将笔记作为一个系列更上来

简单动态字符串(simple dinamic string,即sds) 用来替代c的字符串实现

结构:

struct sdshdr{
    int len;//表示有用数组的长度
    int free;//表示空闲数组的长度
    char buf[];//真正存储字符串的数组
}

要点:

  1. buf[]采用和c中表示string一样的表示方法,即以’\0’结尾,这样可以复用部分c的string函数,
  2. 在len和free的计数中,并不包含’\0’,也就是说,设buf[]的大小为10,若有字符串”li qiang\0”,len=8,free=1;

buf[]的大小

  1. 当存储的数据(len)小于1MB时,预分配的空间(free),与len相等,这时,buf[]的大小=2*len+1byte=2*free+1byte=len+free+1byte.(+1是因为\0存在)
  2. 当存储的数据(len)大于等于1MB时,预分配的空间(free)为1MB,这时,buf[]的大小为,len+free+1byte

使用sds,而不使用string的好处

  1. 避免重复的申请、删除内存空间:buf[]的使用可以通过len和free进一步控制,可以降低对内存的申请,内存操作是内核指令,较为耗费性能
  2. 因为减少了内存操作,有进一步的封装,进而可以避免一些可以造成内存泄漏问题的操作
  3. 在结构体内还是用了char的数组,还可以复用一部分string的方法
  4. 可以在o(1)的复杂度内获取一些常用的信息
  5. 二进制安全:c的string会把’\0’输入结束的标志,这样,对于长文本和字节数据,存储会有问题,而使用sds的leh和buf[],可以确认buf[]的真正结束在哪里,进而可以存储任何数据的二进制字节表示

redis内的使用

基本所有用于表示可能修改的字符串的地方都是sds,c的字符串只用来表示一些不必修改的数据,比如日志

链表

redis的链表是双向链表,并且,在使用链表节点串起链表之余,redis还是用了一个list的结构体,内部存储链表head,tail和删除,比较,复制链表节点的方法,以及节点个数.

结构:

typedef struct listNode{
    struct listNode * prev;//前继
    struct listNode * next;/后续
    void * value;//值
}
typedef struct list{
    listNode * head;
    listNode * tail;
    unsigned long len;
    void (*dup)(void *ptr);
    void (*free)(void *ptr);
    void (*match)(void *ptr);
}

要点

  1. value为void类型,意味可保存任何类型

redis内使用

甚多,列表的存储,订阅与发布功能的实现,慢查询,监视器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值