redis基本数据结构学习

萝らか妹 提交于 2019-11-27 03:37:53

简单动态字符串SDS

1.数据结构

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

2.SDS与C字符串的区别

 

链表 

  1. 常数复杂度获取字符串长度
    1. 通过len变量获取,不用每次调用strlen函数和,strlen函数复杂度为O(n)
  2. 杜绝缓存区溢出 
    1. SDS中buf变量修改时,先检查SDS空间是否满足修改所需的要求,如果不满足,会自动将SDS的空间扩展至所需的大小。然后在执行修改
  3. 减少修改字符串时带来的内存重分配次数

     由于内存重分配涉及复杂的算法,并且可能需要执行系统调用,所以通常是一个比较耗时的操作。redis作为数据库,经常被用于速度要求严苛、数据被频繁修改的场合,如果这种修改频繁地发生的话,可能还会对性能造成影响。

    1. 空间预分配
    2. 惰性空间释放
  4. 二进制安全
  5. 兼容部分C字符串函数

1.数据结构

typedef struct listNode {
    struct listNode *prev;//前置节点
    struct listNode *next;//后置节点
    void *value; //节点的值
} listNode;

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;

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!