---------------------6月23日---------------------------

Redis启动入口即main函数在redis.c文件,伪代码如下:

 int main(int argc, char **argv) {
initServerConfig(); if (argc >= ) {
loadServerConfig(configfile,options);
} else {
redisLog(REDIS_WARNING, "Warning: no config file specified, using the default config. In order to specify a config file use %s /path/to/%s.conf", argv[], server.sentinel_mode ? "sentinel" : "redis");
} initServer();
redisAsciiArt(); if (!server.sentinel_mode) {
/* Things not needed when running in Sentinel mode. */
redisLog(REDIS_WARNING,"Server started, Redis version " REDIS_VERSION);
loadDataFromDisk(); if (server.ipfd > )
redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port); } aeSetBeforeSleepProc(server.el,beforeSleep);
aeMain(server.el);
aeDeleteEventLoop(server.el);
return ;
}

第2行,初始化默认的server 结构,简单看了下,有近200来个字段,记录了和服务器相关的所有数据

第4行,如果启动方式为“redis-server my.conf”,程序会加载该配置文件

第6行,否则的话,打印一个warning,控制台上显示的是#号

第10行,初始化server,这个动真格的了,为一些变量分配了内存,进行了初始化。createSharedObjects对一些经常用到的如“\r\n”进行共享,让它们常驻内存

第11行,用Ascii码把redis的图标画出来了

第15行,Redis启动完成

第16行,从磁盘上加载保存的数据库数据

剩下的利用了ae事件库,还没看。

---------------6月24日---------------------

今天只看半个小时,有点忙。

redisServer这个数据结构里面有太多东西了,今天是看不完了,能啃一点是一点。先看redisObject

 typedef struct redisObject {
unsigned type:;
unsigned notused:; /* Not used */
unsigned encoding:;
unsigned lru:; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;

用到了位段或者说位域,type占4位,可以表示16种type。我们只定义了五种数据类型

/* Object types */
#define REDIS_STRING 0
#define REDIS_LIST 1
#define REDIS_SET 2
#define REDIS_ZSET 3
#define REDIS_HASH 4

encoding当然定义了编码方式

/* Objects encoding. Some kind of objects like Strings and Hashes can be
* internally represented in multiple ways. The 'encoding' field of the object
* is set to one of this fields for this object. */
#define REDIS_ENCODING_RAW 0 /* Raw representation */
#define REDIS_ENCODING_INT 1 /* Encoded as integer */
#define REDIS_ENCODING_HT 2 /* Encoded as hash table */
#define REDIS_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
#define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */
#define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define REDIS_ENCODING_INTSET 6 /* Encoded as intset */
#define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist */

下图展示了 redisObject 、Redis 所有数据类型、以及 Redis 所有编码方式(底层实现)三者之间的关系 ,

图片转自之前提到过的《Redis设计与实现》,以后就不提了。

refCount,引用计数,让人联想到java虚拟机垃圾回收,没错,就是这么理解的。当有对象用到该robj时,refCount加1,初始时为1,当refCount为0时,可以销毁。

---------------------6月25日------------------------------

今天看了Redis的数据库结构redisDB,也不是很复杂啊,虽然我不懂。

先上代码

 typedef struct redisDb {
dict *dict; /* The keyspace for this DB */
dict *expires; /* Timeout of keys with a timeout set */
dict *blocking_keys; /* Keys with clients waiting for data (BLPOP) */
dict *ready_keys; /* Blocked keys that received a PUSH */
dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */
int id;
} redisDb;

dict存键值对,expires键的过期时间,id数据库号,

#define REDIS_DEFAULT_DBNUM     16

select 0,使用0号数据库,redisServer.db[0]。

-----------------------6月26日----------------------------

看了数据库的键空间操作,增、查、删、改,以及过期操作。

过期键删除有3种策略,

  1. 定时删除:在设置键的过期时间时,创建一个定时事件,当过期时间到达时,由事件处理器自动执行键的删除操作。
  2. 惰性删除:放任键过期不管,但是在每次从 dict 字典中取出键值时,要检查键是否过期,如果过期的话,就删除它,并返回空;如果没过期,就返回键值。
  3. 定期删除:每隔一段时间,对 expires 字典进行检查,删除里面的过期键。

-------------------------6月27日---------------------------

Redis提供了两种持久化方法,RDB和AOF

------------------------6月28日----------------------------

 typedef struct zskiplist {
struct zskiplistNode *header, *tail;
unsigned long length;
int level;
} zskiplist;

redis.h里还有个zskiplist,跳表,网易公开课里有专门介绍跳表的。

Redis源码研究--启动过程的更多相关文章

  1. Symfony2源码分析——启动过程2

    文章地址:http://www.hcoding.com/?p=46 上一篇分析Symfony2框架源码,探究Symfony2如何完成一个请求的前半部分,前半部分可以理解为Symfony2框架为处理请求 ...

  2. quartz2.x源码分析——启动过程

    title: quartz2.x源码分析--启动过程 date: 2017-04-13 14:59:01 categories: quartz tags: [quartz, 源码分析] --- 先简单 ...

  3. mysql源码分析-启动过程

    mysql源码分析-启动过程 概要 # sql/mysqld.cc, 不包含psi的初始化过程 mysqld_main: // 加载my.cnf和my.cnf.d,还有命令行参数 if (load_d ...

  4. Redis源码研究--字典

    计划每天花1小时学习Redis 源码.在博客上做个记录. --------6月18日----------- redis的字典dict主要涉及几个数据结构, dictEntry:具体的k-v链表结点 d ...

  5. Spring MVC源码(一) ----- 启动过程与组件初始化

    SpringMVC作为MVC框架近年来被广泛地使用,其与Mybatis和Spring的组合,也成为许多公司开发web的套装.SpringMVC继承了Spring的优点,对业务代码的非侵入性,配置的便捷 ...

  6. Nginx学习笔记(六) 源码分析&启动过程

    Nginx的启动过程 主要介绍Nginx的启动过程,可以在/core/nginx.c中找到Nginx的主函数main(),那么就从这里开始分析Nginx的启动过程. 涉及到的基本函数 源码: /* * ...

  7. Symfony2源码分析——启动过程1

    本文通过阅读分析Symfony2的源码,了解Symfony2启动过程中完成哪些工作,从阅读源码了解Symfony2框架. Symfony2的核心本质是把Request转换成Response的一个过程. ...

  8. 分布式事务_02_2PC框架raincat源码解析-启动过程

    一.前言 上一节已经将raincat demo工程运行起来了,这一节来分析下raincat启动过程的源码 主要包括: 事务协调者启动过程 事务参与者启动过程 二.协调者启动过程 主要就是在启动类中通过 ...

  9. Spring Boot源码分析-启动过程

    Spring Boot作为目前最流行的Java开发框架,秉承"约定优于配置"原则,大大简化了Spring MVC繁琐的XML文件配置,基本实现零配置启动项目. 本文基于Spring ...

随机推荐

  1. 采用handle消息机制实现轮播效果

    // 自动轮播条显示 if (mhandle == null) { mhandle = new Handler() { public void handleMessage(Message mes) { ...

  2. UVa Problem 10132 File Fragmentation (文件还原) 排列组合+暴力

    题目说每个相同文件(01串)都被撕裂成两部分,要求拼凑成原来的样子,如果有多种可能输出一种. 我标题写着排列组合,其实不是什么高深的数学题,只要把最长的那几个和最短的那几个凑一起,然后去用其他几个验证 ...

  3. XHTML文档基本结构

    1.什么是XHTML 即是通常所说的DIV+CSS XHTML (可扩展文本标签语言)英文表示(eXtensiblet HeperText Markup Language) (XHTML是一个扮演着H ...

  4. jQuery选择器之表单对象属性过滤选择器Demo

    测试代码: 08-表单对象属性过滤选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  5. UIScrollView的相关属性说明

    _scrollView = [[UIScrollView alloc] init]; //height = 0:禁止垂直方向滚动 _scrollView.contentSize = CGSizeMak ...

  6. VB.NET 小程序 2

    Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ...

  7. JavaScript--变量、作用域及内存(12)

    // JS变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已; // 由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内 ...

  8. CSS其他

    1.元素的宽度由内容撑开 display:inline;——不支持高度 display:inline-block;——在IE6下,不支持块标签 float position:absolute——每项设 ...

  9. 解决 Oracle em 无法打开的问题

      重建em emca -deconfig dbcontrol db -repos drop 删除 emca -config dbcontrol db -repos create 创建 set ora ...

  10. python中列表 元组 字符串如何互相转换

    python中有三个内建函数:列表,元组和字符串,他们之间的互相转换使用三个函数,str(),tuple()和list(),具体示例如下所示: >>> s = "xxxxx ...