• 服务器实例相关,Redis 在运行时是一个网络服务器实例
  • 服务器实例的初始化和主体控制流程实现文件。

    • server.h&server.c,main函数位于server.c。
  • 对于一个网络服务器来说,它还需要提供网络通信功能。Redis 使用了基于事件驱动机制的网络通信框架。

    • 涉及的代码文件包括 ae.h/ae.c,ae_epoll.c,ae_evport.c,ae_kqueue.c,ae_select.c
  • 与网络通信相关的功能还包括底层 TCP 网络通信和客户端实现

    • Redis 对 TCP 网络通信的 Socket 连接、设置等操作进行了封装,这些封装后的函数实现在 anet.h/anet.c 中。这些函数在 Redis Cluster 创建和主从复制的过程中,会被调用并用于建立 TCP 连接。
    • 客户端在 Redis 的运行过程中也会被广泛使用,比如实例返回读取的数据、主从复制时在主从库间传输数据、Redis Cluster 的切片实例通信等,都会用到客户端。Redis 将客户端的创建、消息回复等功能,实现在了 networking.c 文件中。
      image.png
  • 数据库数据类型与操作,具体的数据结构实现可以看src目录,从文件名就可以看出

    • Redis 数据库提供了丰富的键值对类型,其中包括了 String、List、Hash、Set 和 Sorted Set 这五种基本键值类型。
    • Redis 还支持位图、HyperLogLog、Geo 等扩展数据类型。
    • Redis 作为数据库,还实现了对键值对的新增、查询、修改和删除等操作接口,这部分功能是在 db.c 文件实现的
    • Redis 是如何优化内存使用的呢?Redis 是从三个方面来优化内存使用的,分别是内存分配、内存回收,以及数据替换。

      • 在内存分配方面,Redis 支持使用不同的内存分配器,包括 glibc 库提供的默认分配器 tcmalloc、第三方库提供的 jemalloc。Redis 把对内存分配器的封装实现在了 zmalloc.h/zmalloc.c。
      • 在内存回收上,Redis 支持设置过期 key,并针对过期 key 可以使用不同删除策略,这部分代码实现在 expire.c 文件中。同时,为了避免大量 key 删除回收内存,会对系统性能产生影响,Redis 在 lazyfree.c 中实现了异步删除的功能,所以这样,我们就可以使用后台 IO 线程来完成删除,以避免对 Redis 主线程的影响。
      • 数据替换,如果内存满了,Redis 还会按照一定规则清除不需要的数据,这也是 Redis 可以作为缓存使用的原因。Redis 实现的数据替换策略有很多种,包括 LRU、LFU 等经典算法。这部分的代码实现在了 evict.c 中。
        image.png
  • 高可靠性和高可扩展性

    • 内存快照RDB,源码文件:rdb.h/rdb.c
    • AOF日志,源码文件:aof.c
    • 主从复制功能,源码文件:replication.c
  • 辅助功能

    • 为了便于运维人员查看分析不同操作的延迟产生来源,Redis 在 latency.h/latency.c 中实现了操作延迟监控的功能。
    • 为了便于运维人员查找运行过慢的操作命令,Redis 在 slowlog.h/slowlog.c 中实现了慢命令的记录功能。
    • 运维人员有时还需要了解 Redis 的性能表现,为了支持这一目标,Redis 实现了对系统进行性能评测的功能,这部分代码在 redis-benchmark.c 中。

Architecture
0 声望0 粉丝

知其然, 更要知其所以然~