【redis源码】(九)Redis

 

前些天主要看了redis底层依赖的一些数据结构和事件管理库的代码,比较零散,但大体上了解了作者的设计思路.

对不同规模【n】的数据采用不同的数据结构以实现对内存利用的"最优",这里的最优我想作者也没有做过严格的实验,不同的应用场景在redis上的表现肯定有所不同,如果有必要,可以再配置文件中对一些阈值做调整,比如 hash-max-zipmap-entries和 hash-max-zipmap-value,这两个参数决定了在一定数据规模的时候,是用zipmap作为哈希表数据结构还是dict。

 

好了,开始介绍redis在没有异常的情况下默认的整个工作流程,从main函数开始:

1. 初始化serverConfig

初始化redisServer的成员为默认值,如默认端口号,db数量,是否是守护进程,初始化server.commands

2. 读配置文件

从参数中指定的配置文件一行行获取配置信息,配置文件最大为1024行~

3. 设置守护进程

读取完配置后,如果配置中的daemonize为1,则设置redis为守护进程【弑父认1为父】

4. 执行initServer

a. 初始化对某些信号的处理方式

b. 注册三类事件到ae:

分别是定时事件,执行serverCron, 打印redis各个db的状态信息,试探得进行rehashing扩容,关闭超时的client, 删除过期的key【if master】,连接master【if client,%10】,修改cron计数信息,返回下次循环的时间,

端口监听事件,acceptTcpHandler,当前来连接的fd可读时,读query并进行处理

unix端口监听事件,acceptUnixHandler

4. 如果设置的工作模式为appendonly,则从appendfile中读取已有的持久化数据。否则,从rdbfile中读取持久化数据以完成重启后的数据恢复

5. 设置ae时间管理每一个loop前要执行的方法 beforeSleep

6.开始进入时间管理

posted @ 2012-09-10 22:39  ~嘉言懿行~~我是煲仔饭~~  阅读(458)  评论(0编辑  收藏  举报