最近在看《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; ... }