zoukankan      html  css  js  c++  java
  • redis源代码结构解析

    看了黄建宏老师的《Redis设计与实现》,对redis的部分实现有了一个简明的认识;

    之前面试的时候被问到了这部分的内容,没有关注,好在还有时间,就把Redis的源码看了一遍。

    Redis源码的获取

    Redis是完全开源的,其源代码可以在直接在GitHub上获取:https://github.com/antirez/redis(目前的版本是4.4.0)。此时,进入解压后的redis目录下的src文件夹,redis的所有源代码都存放在此。

     

    源代码结构解析

    redis源码解析看到的redis源码阅读方法,我觉得这适用于很多源码的阅读:

    1. 自底向上:从耦合关系最小的模块开始读,然后逐渐过度到关系紧密的模块。就好像写程序的测试一样,先从单元测试开始,然后才到功能测试。
    2. 从功能入手:通过文件名(模块名)和函数名,快速定位到一个功能的具体实现,然后追踪整个实现的运作流程,从而了解该功能的实现方式。
    3. 自顶向下:从程序的 main() 函数,或者某个特别大的调用者函数为入口,以深度优先或者广度优先的方式阅读它的源码。
    • Redis的数据结构部分
    内存分配 zmalloc.c和zmalloc.h
    动态字符串 sds.h和sds.c
    双端链表 adlist.c和adlist.h
    字典 dict.h和dict.c
    跳跃表 server.h文件里面关于zskiplist结构和zskiplistNode结构,以及t_zset.c中所有zsl开头的函数

     

     

    • Redis的内存编码
    整数集合 intset.h和intset.c
    压缩列表 ziplist.h和ziplist.c
    压缩表 zipmap.h和zipmap.c
    • Redis数据类型
    对象 object.c
    字符串对象 t_string.c
    列表对象 t_list.c
    散列对象 t_hash.c
    集合对象 t_set.c
    有序集合对象 t_zset.c中除 zsl 开头的函数之外的所有函数
    • Redis数据库的实现
    数据库实现 db.c
    RDB持久化 rdb.c
    AOF持久化 aof.c
    通知功能 notify.c
    • 客户端和服务器端的代码实现
    服务器端 redis.c
    客户端 redis-cli.c
    事件处理 ae.c/ae_epoll.c/ae_evport.c/ae_kqueue.c/ae_select.c
    网络链接 anet.c和networking.c
    • Redis多机部分的代码实现
    复制功能 replication.c
    Redis Sentinel sentinel.c
    集群 cluster.c
    • 独立功能模块的实现
    发布和订阅 pubsub.c文件
    事务 multi.c
    lua脚本 scripting.c
    慢查询 slowlog.c
    监视 monitor.c

    整个Redis的源码分类大体上如上所述了。

    后面参考了知乎作者Zeech的关于redis阅读的建议:

    Redis

    redis全称REmote DIctionary Server,是一个由Salvatore Sanfilippo写的高性能key-value存储系统,其完全开源免费,遵守BSD协议。Redis与其他key-value缓存产品(如memcache)有以下几个特点。

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    • Redis支持数据的备份,即master-slave模式的数据备份。

    Redis的性能极高且拥有丰富的数据类型,同时,Redis所有操作都是原子性的,也支持对几个操作合并后原子性的执行。另外,Redis有丰富的扩展特性,它支持publish/subscribe, 通知,key 过期等等特性。

    这里贴出针对Zeech提供的阅读建议,也可以督促自己,希望能够对找到工作有所帮助。

    第一阶段

    • 阅读Redis的数据结构部分,基本位于如下文件中:内存分配 zmalloc.c和zmalloc.h
    • 动态字符串 sds.h和sds.c
    • 双端链表 adlist.c和adlist.h
    • 字典 dict.h和dict.c
    • 跳跃表 server.h文件里面关于zskiplist结构和zskiplistNode结构,以及t_zset.c中所有zsl开头的函数,比如 zslCreate、zslInsert、zslDeleteNode等等。
    • 基数统计 hyperloglog.c 中的 hllhdr 结构, 以及所有以 hll 开头的函数

    第二阶段 熟悉Redis的内存编码结构

    • 整数集合数据结构 intset.h和intset.c
    • 压缩列表数据结构 ziplist.h和ziplist.c

    第三阶段 熟悉Redis数据类型的实现

    • 对象系统 object.c
    • 字符串键 t_string.c
    • 列表建 t_list.c
    • 散列键 t_hash.c
    • 集合键 t_set.c
    • 有序集合键 t_zset.c中除 zsl 开头的函数之外的所有函数
    • HyperLogLog键 hyperloglog.c中所有以pf开头的函数

    第四阶段 熟悉Redis数据库的实现

    • 数据库实现 redis.h文件中的redisDb结构,以及db.c文件
    • 通知功能 notify.c
    • RDB持久化 rdb.c
    • AOF持久化 aof.c

    以及一些独立功能模块的实现

    • 发布和订阅 redis.h文件的pubsubPattern结构,以及pubsub.c文件
    • 事务 redis.h文件的multiState结构以及multiCmd结构,multi.c文件

    第五阶段 熟悉客户端和服务器端的代码实现

    • 事件处理模块 ae.c/ae_epoll.c/ae_evport.c/ae_kqueue.c/ae_select.c
    • 网路链接库 anet.c和networking.c
    • 服务器端 redis.c
    • 客户端 redis-cli.c
    • 这个时候可以阅读下面的独立功能模块的代码实现
    • lua脚本 scripting.c
    • 慢查询 slowlog.c
    • 监视 monitor.c

    第六阶段 这一阶段主要是熟悉Redis多机部分的代码实现

    • 复制功能 replication.c
    • Redis Sentinel sentinel.c
    • 集群 cluster.c

    其他代码文件介绍

    关于测试方面的文件有:

    • memtest.c 内存检测
    • redis_benchmark.c 用于redis性能测试的实现。
    • redis_check_aof.c 用于更新日志检查的实现。
    • redis_check_dump.c 用于本地数据库检查的实现。
    • testhelp.c 一个C风格的小型测试框架。

    一些工具类的文件如下:

    • bitops.c GETBIT、SETBIT 等二进制位操作命令的实现
    • debug.c 用于调试时使用
    • endianconv.c 高低位转换,不同系统,高低位顺序不同
    • help.h 辅助于命令的提示信息
    • lzf_c.c 压缩算法系列
    • lzf_d.c 压缩算法系列
    • rand.c 用于产生随机数
    • release.c 用于发布时使用
    • sha1.c sha加密算法的实现
    • util.c 通用工具方法
    • crc64.c 循环冗余校验
    • sort.c SORT命令的实现
    • 一些封装类的代码实现:
    • bio.c background I/O的意思,开启后台线程用的
    • latency.c 延迟类
    • migrate.c 命令迁移类,包括命令的还原迁移等
    • pqsort.c 排序算法类
    • rio.c redis定义的一个I/O类
    • syncio.c 用于同步Socket和文件I/O操作
  • 相关阅读:
    23.Linux-块设备驱动(详解)
    Linux-fdisk磁盘分区命令(16)
    Linux-mkdosfs格式化磁盘命令(15)
    22.Linux-块设备驱动之框架详细分析(详解)
    21.Linux-写USB键盘驱动(详解)
    20.Linux-USB鼠标驱动
    USB_4大描述符
    JAVA关于静态static的面试题
    eclipse自动提示功能没了的解决办法
    最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法
  • 原文地址:https://www.cnblogs.com/winterfells/p/8478079.html
Copyright © 2011-2022 走看看