文档章节

Redis源码分析系列五:initServer上

强子1985
 强子1985
发布于 2013/10/17 23:10
字数 528
阅读 228
收藏 0

刚下班,吃了点饭,精神饱满,让我们继续分析initServer,这个函数还是很重要的。

~~~~~~~~~~~~~~~~~~

    int j;



    signal(SIGHUP, SIG_IGN);//注册信号处理程序为忽略

    
    signal(SIGPIPE, SIG_IGN);//注册信号处理程序为忽略

下面是setupSignalHandlers();函数,看这个函数的代码,得知目的是:

为信号SIGTERM注册处理程序sigtermHandler

为信号SIGSEGV,SIGBUS,SIGFPE,SIGILL统一注册信号处理程序:sigsegvHandler

 

///////////////////////////////////////////////////////////////////////////////
    if (server.syslog_enabled)
 {
        openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
            server.syslog_facility);
    }
 //默认不执行
 

    server.current_client = NULL;//设置current_client--->NULL

    
    server.clients = listCreate();
 //初始化clients

 
    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();

上面这些代码都很简单,简单的初始化而已。

~~~~~~~~~~

下面来分析createSharedObjects函数

可以看到用到了函数createObject,只不过参数不一样而已,

那我们就看看createObject产生的对象的模板是什么样的!

经过分析,模板如下:

typedef struct redisObject
{
    unsigned type:4;
 //type,由参数决定
 
    unsigned notused:2;     /* Not used */
    unsigned encoding:4;
 ///REDIS_ENCODING_RAW
 
    unsigned lru:22;        /* lru time (relative to server.lruclock) */
 // server.lruclock,此时为 0
 
    int refcount;
 // 1
 
    void *ptr;
 //由参数决定
} robj;

那么就可以相应的改变type和ptr就可以了。

那么剩下的就好说了,这里不赘述。

adjustOpenFilesLimit();
 //调整最大文件打开的数目

~~~~~~~~~~~~~~~~~~~~~

下面是aeCreateEventLoop(server.maxclients+REDIS_EVENTLOOP_FDSET_INCR);

让我们看下这个函数的执行结果

typedef struct aeEventLoop
{
    int maxfd;   /* highest file descriptor currently registered */
     // -1
 
    int setsize; /* max number of file descriptors tracked */
  // ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )
 
    long long timeEventNextId;
   // 0
 
    time_t lastTime;     /* Used to detect system clock skew */
   //2013-10-17 22:56,我看时的时间是这个
 
    aeFileEvent *events; /* Registered events */
 //( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )  *  sizeof(aeFileEvent)
 //且每个event.mask = AE_NONE
 
    aeFiredEvent *fired; /* Fired events */
   // ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )  *  sizeof(aeFiredEvent)
 
    aeTimeEvent *timeEventHead;
    // NULL
 
    int stop;
   // 0
 
    void *apidata; /* This is used for polling API specific data */
    /*
     typedef struct aeApiState {
         int epfd;
         // epoll_create(1024);
   
      struct epoll_event *events;
      // ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )  *  sizeof(epoll_event)
  
       } aeApiState;
   */


    aeBeforeSleepProc *beforesleep;
    // null
 
} aeEventLoop;

其中epfd很重要,使用epoll_create API来创建,这个相信大家都不陌生。

备注:我喜欢用epoll,所以这里我看的是epoll函数。

累了,休息一会。

今天被公司副总任命为项目经理,继续加油,个人觉得问题不大,技术的东西能有多难。


 

 

© 著作权归作者所有

共有 人打赏支持
强子1985

强子1985

粉丝 890
博文 1261
码字总数 932336
作品 8
南京
架构师
私信 提问
Redis网络架构及单线程模型

最近略有闲暇时间,于是对Redis进行了一些学习,学习途径除了官方文档还有Redis源代码,我看的版本是2.8.13,Redis源码总行数不到5W行,不同组件拆分非常细致,阅读起来也很清晰。这篇博客主...

Float_Luuu
2016/05/20
1K
0
Redis源码分析系列七:initServer下

这个函数快到尾声了,一鼓作气! if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) { redisPanic("Can't create the serverCron time event."); exit(1); } 这个函数......

强子哥哥
2013/10/18
0
0
深入Redis内部-Redis 源码讲解

作者:nosqlfan on 星期一, 三月 7, 2011 · 评论本文 【阅读:4,036 次】 Redis 作为 NoSQL 数据库的杰出代表,一直广受关注,其轻量级的敏捷架构,向来有存储中的瑞士军刀之称。下面推荐的...

Dicky
2011/09/25
0
0
Redis源码分析系列六:initserver中

server.db = zmalloc(sizeof(redisDb)*server.dbnum); //开辟缓冲区 listenToPort(server.port,server.ipfd,&server.ipfd_count); 显然这个函数是监听端口 跟踪这个函数,进入,发现最终是掉...

强子哥哥
2013/10/17
0
0
Redis 的事件驱动库结构

原文地址:http://blog.ddup.us/?p=114 这是一篇翻译文章,原文见这里。Redis实现了它自己的事件库。事件库的实现在ae.c文件中。要弄明白Redis事件库是如何工作的最好的方法就是弄明白Red...

红薯
2011/08/14
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

如何开发一款以太坊(安卓)钱包系列2 - 导入账号及账号管理

这是如何开发一款以太坊(安卓)钱包系列第2篇,如何导入账号。有时用户可能已经有一个账号,这篇文章接来介绍下,如何实现导入用户已经存在的账号。 导入账号预备知识 从用户需求上来讲,导...

Tiny熊
今天
2
0
intellJ IDEA搭建java+selenium自动化环境(maven,selenium,testng)

1.安装jdk1.8; 2.安装intellJ; 3.安装maven; 3.1 如果是单前用户,配置用户环境变量即可,如果是多用户,则需配置系统环境变量,变量名为MAVEN_HOME,赋值D:\Application\maven,往path中...

不最醉不龟归
今天
3
0
聊聊ShenandoahGC的Brooks Pointers

序 本文主要研究一下ShenandoahGC的Brooks Pointers Shenandoah Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有 Snapshot-at-the-beginning concurrent mark包括Init Mark(P......

go4it
昨天
2
0
Makefile通用编写规则

#简单实用的Makefile模板: objs := a.o b.o test:$(objs) gcc -o test $^ # .a.o.d .b.o.d dep_files := $(foreach f,$(objs),.$(f).d) dep_files := $(wildcard $(dep_files)) ifneq ($(d......

shzwork
昨天
2
0
《万历十五年》的读后感作文4000字

《万历十五年》的读后感作文4000字: 万历十五年,即1587年,距今已过去432年。在明朝276的历史中,这一年很平淡,并没有什么特别之处。黄仁宇的《万历十五年》一书,有别于其他的历史叙述方...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部