(一) Redis数据结构:SDS和链表

最近在看《Redis设计与结构》这本书。整理了一些笔记。安全

SDS

Redis中的字符串基本上用的都是本身定义的sdshdr结构。函数

struct sdshdr {
    int len;
    int free;
    char buf[];
};

len属性记录了当前字符串的长度,值得注意的是,这个长度并不包括\0
free为0时,表明当前SDS没有空余的空间。
buf保存了一个c类型的字符串。而且以\0做为结尾。设计

这样子的设计有这些好处。code

  1. 记录了字符串的长度,能够让咱们在O(1)时间内获取长度。
  2. 咱们能够给buf分配更大的空间,这样子在后续对字符串进行操做时,就不用频繁地分配内存了。
  3. SDS是二进制安全的。由于C类型的字符串永远以\0做为结尾,若是咱们须要保存的数据中包含了\0这样的字符,会致使访问不到后续的字符。SDS则能够经过len元素来判断是否到达字符串的终点。
  4. 仍然能够使用C语言的字符串函数库。

链表

Redis使用了双向链表。内存

struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
};

而且链表结构中保存了表头结点,表尾节点,链表长度以及一些函数。字符串

struct list {
    listNode *head;
    listNode *tail;
    unsigned long len;
    ...
}
相关文章
相关标签/搜索