Redis5 设计与源码分析 阅读笔记 01
从github上下载redis的源代码,地址为 https://github.com/antirez/redis.git
mac 事先安装了CLion,导入redis源码工程如下,然后切换到redis 6.0
第2章 简单动态字符串
实现类为sds.h 和 sds.c
struct sds {
int len; // buf中已占用字节数
int free;// buf中剩余字节数
char buf[] ;// 数据空间
}
redis 字符串设计优点
1.有单独的统计变量len和free,可以很方便得到字符串长度
2.内容存放在柔性数组buf中
3.有长度统计len存在,读写字符串不用依赖"\0"终止符,保证了二进制安全
len和free各自占用4个字节,总共8个字节
由于有free变量,所以使用字符串时,可以直接判断出是否需要申请空间
字符串扩容 :
1. 若sds 中剩余空闲长度avail 大于新增内容长度addLen,直接在柔性数组buf末尾追加即可,无需扩容
2.若sds 剩余空闲长度avail 小于等于新增长度addLen
len+addLen < 1MB, 则按照新长度2倍扩容
len + addLen > 1MB, 按照新长度+1MB 扩容
第3章 跳跃表
每一层都是一个有序链表,查找时,优先从最高层向后查找;到达某节点时,如果next节点大于要查找的值或者next指针
指向NULL,从当前节点下一层继续寻找
主要用于有序集合ZSet的实现
查询 ,插入 ,删除平均复杂度都为O(logN)