《Redis设计与实现》学习笔记 一、Redis数据结构和底层原理
1、简单动态字符串SDS
-
应用:
-
字符串对象底层实现
-
缓冲区(AOF,客户端状态中的输入缓冲区)
-
-
数据结构:
struct sdshdr { // 记录 buf 数组中已使用字节的数量 // 等于 SDS 所保存字符串的长度 int len; // 记录 buf 数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[]; };
-
特性:
- 取字符串长度O(1);
- 二进制安全:有len记录长度,相比C语言,字符串中间遇到’\0’不会中断;
- 杜绝缓存溢出-检查容量、自己扩容;
- 减少修改字符串长度时所需内存重分配次数-空间预分配(SDS增长,N次增长最多N次扩容)、惰性空间释放(SDS减少,不释放内存,用free记录);
- 兼容部分C字符串函数。
- 唯一一种可以被其他四种对象嵌套的对象。
2、链表-list
-
应用:
- 列表键的底层实现:列表元素数量多、元素是长字符串;
- 发布、订阅、慢查询、监视器;
-
数据结构:
多个listNode组成一个list,listNode通过前后指针形成双端链表;
adlist.h/listNode
typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; } listNode;
adlist.h/list
typedef struct list { // 表头节点 listNode *head; // 表尾节点 listNode *tail; // 链表所包含的节点数量 unsigned long len; // 节点值复制函数 void *(*dup