redis源码阅读[3]
2015-08-16 11:08
537 查看
本节主要介绍RedisServer的初始化过程,即redis启动过程中的initServer()函数(redis.c文件)。
initServer()主要初始化一些服务器信息,包括创建事件处理对象、db数据结构、socket等。
事件处理器eventLoop结构体(ae.h/ae.c)主要记录目前已注册的各个描述符,以及已注册和已就绪的文件事件等信息。函数aeCreateEventLoop就是用来初始化事件处理器结构体的。
listenToPort函数初始化一系列文件描述符来监听redis服务初始化文件列表中指定特定地址的端口。主要利用函数
_anetTcpServer(anet.c文件)来初始化文件描述符,类似打开文件获取文件句柄。
UNIX本地端口 干啥用的??
[TODO]
initServer()主要初始化一些服务器信息,包括创建事件处理对象、db数据结构、socket等。
void initServer() { int j; // 设置信号处理函数 signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); setupSignalHandlers(); // 设置 syslog if (server.syslog_enabled) { openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT, server.syslog_facility); }
// 初始化并创建数据结构 server.current_client = NULL; server.clients = listCreate(); server.clients_to_close = listCreate(); server.slaves = listCreate(); server.monitors = listCreate(); server.slaveseldb = -1; /* Force to emit the first SELECT command. */ server.unblocked_clients = listCreate(); server.ready_keys = listCreate(); server.clients_waiting_acks = listCreate(); server.get_ack_from_slaves = 0; server.clients_paused = 0; // 创建共享对象 createSharedObjects(); adjustOpenFilesLimit(); server.el = aeCreateEventLoop(server.maxclients+REDIS_EVENTLOOP_FDSET_INCR);//初始化事件处理器状态 server.db = zmalloc(sizeof(redisDb)*server.dbnum);
事件处理器eventLoop结构体(ae.h/ae.c)主要记录目前已注册的各个描述符,以及已注册和已就绪的文件事件等信息。函数aeCreateEventLoop就是用来初始化事件处理器结构体的。
// 打开 TCP 监听端口,用于等待客户端的命令请求 if (server.port != 0 && listenToPort(server.port,server.ipfd,&server.ipfd_count) == REDIS_ERR) exit(1);
listenToPort函数初始化一系列文件描述符来监听redis服务初始化文件列表中指定特定地址的端口。主要利用函数
_anetTcpServer(anet.c文件)来初始化文件描述符,类似打开文件获取文件句柄。
// 打开 UNIX 本地端口 if (server.unixsocket != NULL) { unlink(server.unixsocket); server.sofd = anetUnixServer(server.neterr,server.unixsocket, server.unixsocketperm, server.tcp_backlog); if (server.sofd == ANET_ERR) { redisLog(REDIS_WARNING, "Opening socket: %s", server.neterr); exit(1); } anetNonBlock(NULL,server.sofd); }
UNIX本地端口 干啥用的??
[TODO]
// 创建并初始化数据库结构 for (j = 0; j < server.dbnum; j++) { server.db[j].dict = dictCreate(&dbDictType,NULL); server.db[j].expires = dictCreate(&keyptrDictType,NULL); server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL); server.db[j].ready_keys = dictCreate(&setDictType,NULL); server.db[j].watched_keys = dictCreate(&keylistDictType,NULL); server.db[j].eviction_pool = evictionPoolAlloc(); server.db[j].id = j; server.db[j].avg_ttl = 0; }
// 为 serverCron() 创建时间事件 if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) { redisPanic("Can't create the serverCron time event."); exit(1); }
// 为 TCP 连接关联连接应答(accept)处理器 // 用于接受并应答客户端的 connect() 调用 for (j = 0; j < server.ipfd_count; j++) { if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE, acceptTcpHandler,NULL) == AE_ERR) { redisPanic( "Unrecoverable error creating server.ipfd file event."); } }
// 为本地套接字关联应答处理器 if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE, acceptUnixHandler,NULL) == AE_ERR) redisPanic("Unrecoverable error creating server. sofd file event.");
相关文章推荐
- windows下安装redis
- redis cluster
- Redis监控工具,命令和调优
- Redis监控工具,命令和调优
- Redis学习——SDS字符串源码分析
- Redis学习笔记(1)
- 【学习笔记】C++操作redis库
- Redis学习——环境搭建以及基础命令使用
- Redis的介绍
- Redis学习(6)-Redis高级实用特性
- redis安装过程中一些注意事项
- 小贝_php+redis类型组合使用
- 小贝_php+redis简单实例
- 小贝_redis 高级应用-持久化
- Redis入门
- Redis学习(5)-常用命令
- Redis学习(4)-数据类型set和zset
- Redis
- 3、Redis 集群特性之容错、数据迁移
- redis 学习笔记(二)