(一)Redis结构解析

从今天起,本人将会展开对Redis源码的学习,Redis的代码规模比较小,非常适合学习,是一份非常不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的。希望最终能把他啃完吧,C语言好久不用,快忘光了。分析源码的第一步,先别急着想着从哪开始看起,先浏览一下源码结构,可以模块式的渐入,不过比较坑爹的是,Redis的源码全部放在在里面的src目录里,一下90多个文件统统在里面了,所以我选择了拆分,按功能拆分,有些文件你看名字就知道那是干什么的。我拆分好后的而结果如下:

11个包,这样每个包中的文件就比较可接受了,但是分出这个类别,我也是花了一定时间,思考了下,Redis下的主要的一些文件的特征,最后定的,应该算是比较全的了。

下面开始一个包一个包的介绍:

test:(测试) 1.memtest.c 内存检测 2.redis_benchmark.c 用于redis性能测试的实现。 3.redis_check_aof.c 用于更新日志检查的实现。 4.redis_check_dump.c 用于本地数据库检查的实现。 5.testhelp.c 一个C风格的小型测试框架。 struct:(结构体) 1.adlist.c 用于对list的定义,它是个双向链表结构 2.dict.c 主要对于内存中的hash进行管理 3.sds.c 用于对字符串的定义 4.sparkline.c 一个拥有sample列表的序列 5.t_hash.c hash在Server/Client中的应答操作。主要通过redisObject进行类型转换。 6.t_list.c list在Server/Client中的应答操作。主要通过redisObject进行类型转换。 7.t_set.c set在Server/Client中的应答操作。主要通过redisObject进行类型转换。 8.t_string.c string在Server/Client中的应答操作。主要通过redisObject进行类型转换。 9.t_zset.c zset在Server/Client中的应答操作。主要通过redisObject进行类型转换。 10.ziplist.c ziplist是一个类似于list的存储对象。它的原理类似于zipmap。 11.zipmap.c zipmap是一个类似于hash的存储对象。 data:(数据操作) 1.aof.c 全称为append only file,作用就是记录每次的写操作,在遇到断电等问题时可以用它来恢复数据库状态。 2.config.c 用于将配置文件redis.conf文件中的配置读取出来的属性通过程序放到server对象中。 3.db.c对于Redis内存数据库的相关操作。 4.multi.c用于事务处理操作。 5.rdb.c 对于Redis本地数据库的相关操作,默认文件是dump.rdb(通过配置文件获得),包括的操作包括保存,移除,查询等等。 6.replication.c 用于主从数据库的复制操作的实现。 tool:(工具) 1.bitops.c 位操作相关类 2.debug.c 用于调试时使用 3.endianconv.c 高低位转换,不同系统,高低位顺序不同 4.help.h 辅助于命令的提示信息 5.lzf_c.c 压缩算法系列 6.lzf_d.c 压缩算法系列 7.rand.c 用于产生随机数 8.release.c 用于发步时使用 9.sha1.c sha加密算法的实现 10.util.c 通用工具方法 11.crc64.c 循环冗余校验 event:(事件) 1.ae.c 用于Redis的事件处理,包括句柄事件和超时事件。 2.ae_epoll.c 实现了epoll系统调用的接口 3.ae_evport.c 实现了evport系统调用的接口 4.ae_kqueue.c 实现了kqueuex系统调用的接口 5.ae_select.c 实现了select系统调用的接口 baseinfo:(基本信息) 1.asciilogo,c redis的logo显示 2.version.h定有Redis的版本号 compatible:(兼容) 1.fmacros.h 兼容Mac系统下的问题 2.solarisfixes.h 兼容solary下的问题 main:(主程序) 1.redis.c redis服务端程序 2.redis_cli.c redis客户端程序 net:(网络) 1.anet.c 作为Server/Client通信的基础封装 2.networking.c 网络协议传输方法定义相关的都放在这个文件里面了。 wrapper:(封装类) 1.bio.c background I/O的意思,开启后台线程用的 2.hyperloglog.c 一种日志类型的 3.intset.c 整数范围内的使用set,并包含相关set操作。 4.latency.c 延迟类 5.migrate.c 命令迁移类,包括命令的还原迁移等 6.notify.c 通知类 7.object.c 用于创建和释放redisObject对象 8.pqsort.c 排序算法类 9.pubsub.c 用于订阅模式的实现,有点类似于Client广播发送的方式。 10.rio.c redis定义的一个I/O类 11.slowlog.c 一种日志类型的,与hyperloglog.c类似 12.sort.c 排序算法类,与pqsort.c使用的场景不同 13.syncio.c 用于同步Socket和文件I/O操作。 14.zmalloc.c 关于Redis的内存分配的封装实现 others:(存放了一些我暂时还不是很清楚的类,所以没有解释了) 1.scripting.c 2.sentinel.c 2.setproctitle.c 3.valgrind.sh 4.redisassert.h

我分析的此Redis源代码是目前最新的代码redis-2.8.17,确保是最新的,新加了crc64.c等这些在2.2左右的版本上根本没有, 里面的很多.h头文件被我省掉了,因为很多同个文件名.h,.c文件都是其实指的是同个功能,后续,我将会分模块式分析Redis源代码,工作的时候根本没时间进行代码级别的研究。抓紧时间啦,fighting!

原文发布于微信公众号 - 高性能服务器开发(easyserverdev)

原文发表时间:2018-03-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

1.Linux电源管理-休眠与唤醒

当我们休眠时,如果想唤醒,则需要添加中断唤醒源,使得在休眠时,这些中断是设为开启的,当有中断来,则会退出唤醒,常见的中断源有按键,USB等.

3952
来自专栏编程

并发服务器(三):事件驱动

另一种常见的实现并发的方法叫做 事件驱动编程,也可以叫做 异步 编程 。这种方法变化万千,因此我们会从最基本的开始,使用一些基本的 API 而非从封装好的高级方...

2955
来自专栏漏斗社区

工具| 诸神之眼nmap定制化之并发处理

当我们使用nmap来进行大规模探测的时候,速度和准确度是摆在我们面前的两个问题,这时需要考虑到nmap的并发处理能力。 0x01 nmap本身的并发执行 相关...

3775
来自专栏林冠宏的技术文章

Golang, 以17个简短代码片段,切底弄懂 channel 基础

(原创出处:https://cloud.tencent.com/developer/user/1148436/activities) 前序:   因为打算自己搞...

3805
来自专栏全沾开发(huā)

使用postman进行API自动化测试

使用postman进行API自动化测试 最近在进行一个老项目的升级,第一步是先将node版本从4.x升级到8.x,担心升级会出现问题...

5777
来自专栏散尽浮华

redis cluster集群管理工具redis-trib.rb命令小结-运维笔记

redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实...

1613
来自专栏Charlie's Road

<Solidity学习系列二>深入理解Solidity之二---Solidity源代码文件结构

版本Pragma 源文件可以(也应该)用所谓的版本注释来注释,以拒绝被编译为未来可能引入不兼容更改的编译器版本。 我们试图将这种变化保持在绝对最低限度,特别是引...

781
来自专栏我是业余自学C/C++的

C++中的文件和流

1214
来自专栏大内老A

[WCF 4.0新特性] 标准终结点与无(.SVC)文件服务激活

今天介绍WCF 4.0的另外两个新特性:标准终结点(Standard Endpoint)和无(.SVC)文件服务激活(File-Less Activation)...

24110
来自专栏州的先生

如何提高爬虫效率?Python下简单的进程、线程效率对比

2266

扫码关注云+社区