redis源码分析一
一.大体框架流程
配置解析-redis服务初始化-事件注册-工作主函数
二.主要函数
1.linuxOvercommitMemoryWarning()
读取内核参数 /proc/sys/vm/overcommit_memory, 该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
2.static void initServerConfig()
初始化服务端参数,即结构
struct redisServer {
int port;
int fd;
redisDb *db;
dict *sharingpool;
unsigned int sharingpoolsize;
long long dirty; /* changes to DB from the last save */
list *clients;
list *slaves, *monitors;
char neterr[ANET_ERR_LEN];
aeEventLoop *el;
int cronloops; /* number of times the cron function run */
list *objfreelist; /* A list of freed objects to avoid malloc() */
time_t lastsave; /* Unix time of last save succeeede */
size_t usedmemory; /* Used memory in megabytes */
/* Fields used only for stats */
time_t stat_starttime; /* server start time */
long long stat_numcommands; /* number of processed commands */
long long stat_numconnections; /* number of connections received */
/* Configuration */
int verbosity;
int glueoutputbuf;
int maxidletime;
int dbnum;
int daemonize;
char *pidfile;
int bgsaveinprogress;
pid_t bgsavechildpid;
struct saveparam *saveparams;
int saveparamslen;
char *logfile;
char *bindaddr;
char *dbfilename;
char *requirepass;
int shareobjects;
/* Replication related */
int isslave;
char *masterhost;
int masterport;
redisClient *master; /* client that is master for this slave */
int replstate;
unsigned int maxclients;
unsigned int maxmemory;
/* Sort parameters - qsort_r() is only available under BSD so we
* have to take this state global, in order to pass it to sortCompare() */
int sort_desc;
int sort_alpha;
int sort_bypattern;
};
3.ResetServerSaveParams();
重置数据字典保存时间参数
4.loadServerConfig(char **);
配置文件加载并设置redis server配置结构体
5.redisLog(int level, const char *fmt, ...)
日志输出函数
6.initServer()
redis初始化,包括内存空间申请、socket服务器初始化、字典初始化
7. rdbLoad(char *filename)
加载数据字典文件到hash表
8.aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,
aeFileProc *proc, void *clientData,
aeEventFinalizerProc *finalizerProc)
注册IO事件到事件链
9.void aeMain(aeEventLoop *eventLoop)
redis主函数,根据io事件做相应处理
10.acceptHandler(aeEventLoop *el, int fd, void *privdata, int mask)
有客户端连接到server,将客户端信息添加到客户端链表,已连接客户端数加1
11.static int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData)
具体事件处理函数,形如增删改查等操作实现
阅读(1472) | 评论(0) | 转发(0) |