最近在看《Redis設計與結構》這本書。整理了一些筆記。安全
Redis中的字符串基本上用的都是本身定義的sdshdr結構。函數
struct sdshdr { int len; int free; char buf[]; };
len
屬性記錄了當前字符串的長度,值得注意的是,這個長度並不包括\0
free
爲0時,表明當前SDS
沒有空餘的空間。buf
保存了一個c類型的字符串。而且以\0
做爲結尾。設計
這樣子的設計有這些好處。code
O(1)
時間內獲取長度。buf
分配更大的空間,這樣子在後續對字符串進行操做時,就不用頻繁地分配內存了。SDS
是二進制安全的。由於C類型的字符串永遠以\0
做爲結尾,若是咱們須要保存的數據中包含了\0
這樣的字符,會致使訪問不到後續的字符。SDS
則能夠經過len
元素來判斷是否到達字符串的終點。Redis使用了雙向鏈表。內存
struct listNode { struct listNode *prev; struct listNode *next; void *value; };
而且鏈表結構中保存了表頭結點,表尾節點,鏈表長度以及一些函數。字符串
struct list { listNode *head; listNode *tail; unsigned long len; ... }