通过学习了一段时间的redis设计与实现,结合自己的学习心得简单总结一下学习路线
- 第一步:先找一个简单的教程,我就找的菜鸟教程redis,把里边所有的数据类型还有怎么操作跟着教程走一遍,经过此步骤之后你就会完全熟悉redis的几种数据结构及其使用方法
- 第二步:掌握了数据结构然后需要深入的了解了,比方说面试会问你来说下redis sds数据结构的实现方式,惰性删除策略有几种,list底层使用的有几种struct,aof rdb,主从同步,哨兵集群原理等等等等
- 第三步:你已经知道现在自己需要的是什么了加深一步了解,最一开始写代码的两年,我也是不太懂为什么非得要搞懂这些,搞懂这些的意义是什么,当某一天接触到了一些东西,突然发现确实需要学习这些东西
- 第三步:寻找redis系统的书籍去耐心的观看,每一次都会有不同的收获
- 下边介绍一下redis的大概结构图
先展示一张redis的一个key-value存储到底在底层是什么样的,以一个RAW 的 SDS为例(其中省略了很多很多参数具体可以深入学习之后就会了解或者访问这里)
struct redisServer {
redisDb *db;
}
typedef struct redisDb {
dict *dict;
}
typedef struct dict {
dictht ht[2];
} dict;
typedef struct dictht {
dictEntry **table;
} dictht;
typedef struct dictEntry {
void *key;
union {
void *val;
} v;
} dictEntry;
typedef struct redisObject {
void *ptr;
} robj;
struct sdshdr {
char buf[];
};
这样一看是不是就直接的感受到了redis的存储结构了
其中最复杂的在这个dictEntry->union->val
这个结构里存储了我们所说的字符串、列表、hash、
有序集合和无序集合,还有他们具体的数据结构比方说SDS就有三种
1、第一种就是一个数字,redisObject->ptr就是指向一个具体的值
2、第二种就是一个比较小的字符串,redisObject->ptr 会直接保存sds的具体结构,因为计算机的内存分配机制
3、第三种比较长的字符串,ptr会指向一个其他地址的sds
其中的geo和其他的一些结构我还没具体研究,本小白还需要回炉深造