Chinaunix首页 | 论坛 | 博客
  • 博客访问: 463252
  • 博文数量: 56
  • 博客积分: 517
  • 博客等级: 下士
  • 技术积分: 751
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-12 18:16
文章分类

全部博文(56)

文章存档

2015年(2)

2014年(6)

2013年(29)

2012年(17)

2011年(2)

分类: 服务器与存储

2013-02-22 15:55:00

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) |
给主人留下些什么吧!~~