(一) 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;
    ...
}
相關文章
相關標籤/搜索