返回 登录
0

Redis学习笔记(三)

附上个人博客,欢迎大家一起来交流和学习!
经过前两节的学习,我们已经可以在本地搭建Redis环境,并且可以通过简单的命令行来对Redis进行操作,当然这离实现完全掌握Redis,并且将其用作工业用途,那要走的路还有很多很多,今天换个角度来继续学习Redis。
再回顾一下Redis的简介:Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API 可以看到Redis是基于C语言实现的,因此,我们这一节就简单介绍一下Redis的源码的结构以及如何通过源码来深入学习Redis。
首先我们需要将Redis的源码下载到本地,这里为大家推荐一款非常强大的代码阅读器-Source Insight,顺便附上一个下载地址,大家可以先去下载下来安装好。
接下来要做的就是获取Redis的源码,我们可以登录 (英文网站也有,英语好的同学可以去看看~),登录到网站以后,点击Redis下载以后,再点击Windows中more按钮,会跳转到github里的Redis项目:
图片描述
将整个项目都下载到本地,压缩包解压后,src里面就是Redis项目的源码:
图片描述,还记得咱们之前安装好的Source Insight么?打开它:
图片描述
新建一个项目并且载入Redis项目代码,Redis的代码并不多,100多个文件,总共3万行代码的样子,为了能更好地阅读源码,我们将Redis的源码分为几个层次,然后层层递进地去阅读源码:

第一层:数据结构。
前一节介绍了Redis中的数据类型,分别是最常用的字符串、双向链表、哈希,其相应的文件分别是:sds.c、adlist.c、dict.c,掌握好这些数据结构,就是学习Redis的第一步。

第二层:内存编码数据结构实现
在阅读完和数据结构有关的文件之后, 接下来就应该阅读内存编码(encoding)数据结构了。和普通的数据结构一样, 内存编码数据结构基本上是独立的, 不和其他模块耦合, 但是区别在于:
上一步要读的数据结构, 比如双向链表、哈希表、在算法书上或者相关的论文上都可以找到资料介绍,而内存编码数据结构却不容易找到相关的资料, 因为这些数据结构都是 Redis 为了节约内存而专门开发出来的, 换句话说, 这些数据结构都是特制(adhoc)的, 除了 Redis 源码中的文档之外, 基本上找不到其他资料来了解这些特制的数据结构。
不过话又说回来, 虽然内存编码数据结构是 Redis 特制的, 但它们基本都和内存分配、指针操作、位操作这些底层的东西有关, 读者只要认真阅读源码中的文档, 并在有需要时, 画图来分析这些数据结构, 那么要完全理解这些内存编码数据结构的运作原理并不难, 当然这需要花一些功夫。
各个内存编码数据结构的实现文件:
intset.h和 intset.c 整数集合(intset)数据结构。
ziplist.h和 ziplist.c 压缩列表(zip list)数据结构。

第三层:阅读数据类型实现
object.c Redis 的对象(类型)系统实现。
t_string.c 字符串键的实现。
t_list.c 列表键的实现。
t_hash.c 哈希键的实现。
t_set.c 集合键的实现。
t_zset.c 有序集合键的实现。
hyperloglog.c HyperLogLog 键的实现。

第四层:数据库实现相关代码
redis.h 文件中的 redisDb结构。Redis 的数据库实现。
notify.cRedis 的数据库通知功能实现代码。
rdb.h和 rdb.c Redis 的 RDB 持久化实现代码。
aof.c Redis 的 AOF 持久化实现代码。

第四层:客户端和服务器的相关代码

ae.c Redis 的事件处理器实现(基于 Reactor 模式)。
networking.c Redis 的网络连接库,负责发送命令回复和接受命令请求, 同时也负责创建/销毁客户端, 以及通信协议分析等工作。
redis.h 和 redis.c中和单机 Redis 服务器有关的部分。
单机 Redis 服务器的实现。

第六层:阅读多机功能的实现
replication.c 复制功能的实现代码。
sentinel.c Redis Sentinel 的实现代码。
cluster.c Redis 集群的实现代码。

在读完了上述所有的代码后,相信你即便没有怎么使用过Redis,也能大致了解Redis的运行机制,对我们学习Redis提供很好的帮助!

评论