Redis源码分析(一)--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!

时间: 2024-10-06 16:32:15

Redis源码分析(一)--Redis结构解析的相关文章

MySQL系列:innodb源码分析之page结构解析

在表空间结构分析当中,我们知道innodb的最小物理存储分配单位是page页,在MySQL-3.23版本的源码中,页只有两种页,一种是index page,一种是undo page.其类型值定义在fil0fil.h当中. FIL_PAGE_INDEX                         数据索引页,在表空间的inode page和xdes page都是属于这类. FIL_PAGE_UNDO_LOG                事务回滚日志页. 在这里我们主要分析的是 index p

redis源码分析4---结构体---跳跃表

redis源码分析4---结构体---跳跃表 跳跃表是一种有序的数据结构,他通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的: 跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点.性能上和平衡树媲美,因为事先简单,常用来代替平衡树. 在redis中,只在两个地方使用了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构. 1 跳跃表节点 1.1 层 层的数量越多,访问其他节点的速度越快: 1.2 前进指针 遍历举例

redis源码分析3---结构体---字典

redis源码分析3---结构体---字典 字典,简单来说就是一种用于保存键值对的抽象数据结构: 注意,字典中每个键都是独一无二的:在redis中,内部的redis的数据库就是使用字典作为底层实现的: 1 字典的实现 在redis中,字典是使用哈希表作为底层实现的,一个hash表里面可以有多个hash表节点,而每个hash表节点就保存了字典中的一个键值对: hash表定义 table属性是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存着一个键值

redis 源码分析(一) 内存管理

一,redis内存管理介绍 redis是一个基于内存的key-value的数据库,其内存管理是非常重要的,为了屏蔽不同平台之间的差异,以及统计内存占用量等,redis对内存分配函数进行了一层封装,程序中统一使用zmalloc,zfree一系列函数,其对应的源码在src/zmalloc.h和src/zmalloc.c两个文件中,源码点这里. 二,redis内存管理源码分析 redis封装是为了屏蔽底层平台的差异,同时方便自己实现相关的函数,我们可以通过src/zmalloc.h 文件中的相关宏定义

【Redis源码剖析】 - Redis内置数据结构值压缩字典zipmap

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在zipmap.h和zipmap.c文件中.我把zipmap称作"压缩字典"(不知道这样称呼正不正确)是因为zipmap利用字符串实现了一个简单的hash_table结构,又通过固定的字节表示节省空间.zipmap和前面介绍的ziplist结构十分类似,我们可以对比地进行学习: Redis中

redis源码分析之内存布局

redis源码分析之内存布局 1. 介绍 众所周知,redis是一个开源.短小.高效的key-value存储系统,相对于memcached,redis能够支持更加丰富的数据结构,包括: 字符串(string) 哈希表(map) 列表(list) 集合(set) 有序集(zset) 主流的key-value存储系统,都是在系统内部维护一个hash表,因为对hash表的操作时间复杂度为O(1).如果数据增加以后,导致冲突严重,时间复杂度增加,则可以对hash表进行rehash,以此来保证操作的常量时

redis源码分析之事务Transaction(下)

接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令. 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需要先对上面文章有所了解: redis源码分析之事务Transaction(上) 一.redis事务核心命令简介 redis事务操作核心命令: //用于开启事务 {"multi",multiCommand,1,"sF",0,NULL,0,0,0,0,0}, //用来执行事

【Redis源码剖析】 - Redis数据类型之有序集合zset

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51231967 这周事情比较多,原本计划每周写两篇文章的任务看来是完不成了.今天为大家带来有序集合zset的源码分析. Redis中的zset主要支持以下命令: zadd.zincrby zrem.zremrangebyrank.zremrangebyscore.zremrangebyrank zrange.zrevrange.zrangebyscore.zrevrangebys

【Redis源码剖析】 - Redis数据类型之列表List

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51166709 今天为大家带来Redis五大数据类型之一 – List的源码分析. Redis中的List类型是一种双向链表结构,主要支持以下几种命令: lpush.rpush.lpushx.rpushx lpop.rpop.lrange.ltrim.lrem.rpoplpush linsert.llen.lindex.lset blpop.brpop.brpoplpush Li

【Redis源码剖析】 - Redis之数据库redisDb

原创作品,转载请标明:http://blog.csdn.net/xiejingfa/article/details/51321282 今天,我们来讨论两点内容:一是Redis是如何存储类型对象的,二是Redis如何实现键的过期操作. 本文介绍的内容主要涉及db.c和redis.h两个文件. 1.redisDb介绍 Redis中存在"数据库"的概念,该结构由redis.h中的redisDb定义.我们知道Redis提供string.list.set.zset.hash五种数据类型的存储,在