Redis源码研究--启动过程
---------------------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种策略,
- 定时删除:在设置键的过期时间时,创建一个定时事件,当过期时间到达时,由事件处理器自动执行键的删除操作。
- 惰性删除:放任键过期不管,但是在每次从 dict 字典中取出键值时,要检查键是否过期,如果过期的话,就删除它,并返回空;如果没过期,就返回键值。
- 定期删除:每隔一段时间,对 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源码研究--启动过程的更多相关文章
- Symfony2源码分析——启动过程2
文章地址:http://www.hcoding.com/?p=46 上一篇分析Symfony2框架源码,探究Symfony2如何完成一个请求的前半部分,前半部分可以理解为Symfony2框架为处理请求 ...
- quartz2.x源码分析——启动过程
title: quartz2.x源码分析--启动过程 date: 2017-04-13 14:59:01 categories: quartz tags: [quartz, 源码分析] --- 先简单 ...
- mysql源码分析-启动过程
mysql源码分析-启动过程 概要 # sql/mysqld.cc, 不包含psi的初始化过程 mysqld_main: // 加载my.cnf和my.cnf.d,还有命令行参数 if (load_d ...
- Redis源码研究--字典
计划每天花1小时学习Redis 源码.在博客上做个记录. --------6月18日----------- redis的字典dict主要涉及几个数据结构, dictEntry:具体的k-v链表结点 d ...
- Spring MVC源码(一) ----- 启动过程与组件初始化
SpringMVC作为MVC框架近年来被广泛地使用,其与Mybatis和Spring的组合,也成为许多公司开发web的套装.SpringMVC继承了Spring的优点,对业务代码的非侵入性,配置的便捷 ...
- Nginx学习笔记(六) 源码分析&启动过程
Nginx的启动过程 主要介绍Nginx的启动过程,可以在/core/nginx.c中找到Nginx的主函数main(),那么就从这里开始分析Nginx的启动过程. 涉及到的基本函数 源码: /* * ...
- Symfony2源码分析——启动过程1
本文通过阅读分析Symfony2的源码,了解Symfony2启动过程中完成哪些工作,从阅读源码了解Symfony2框架. Symfony2的核心本质是把Request转换成Response的一个过程. ...
- 分布式事务_02_2PC框架raincat源码解析-启动过程
一.前言 上一节已经将raincat demo工程运行起来了,这一节来分析下raincat启动过程的源码 主要包括: 事务协调者启动过程 事务参与者启动过程 二.协调者启动过程 主要就是在启动类中通过 ...
- Spring Boot源码分析-启动过程
Spring Boot作为目前最流行的Java开发框架,秉承"约定优于配置"原则,大大简化了Spring MVC繁琐的XML文件配置,基本实现零配置启动项目. 本文基于Spring ...
随机推荐
- ListView的addAll方法
add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素addAll是传入一个List,将此List中的所有元素加入到当前List中,也就是当 ...
- Ajax的工作原理
Ajax的核心是JavaScript对象XmlHttpRequest.该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术.简而言之,XmlHttpRequest使您可 ...
- Java中ThreadLocal的设计与使用
早在Java 1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择.使用这个工具类可以很简洁地编写出优美的多线程程 ...
- [SQLServer]学习总结笔记(基本涵盖Sql的所有操作)
--################################################################################### /* 缩写: DDL(Dat ...
- Java基础知识强化105:打印数组的方法总结
1. 使用for循环打印数组. 2. 使用Arrays工具类,将数组转化为有序的List打印出来. 3. 使用Arrays工具类,使用Arrays.toString()输出数组内容. 上面三种方法打印 ...
- Chrome隐身模式有什么用
最近发布的Chrome浏览器,小编发现有一个个“隐身窗口”功能,那么这是什么功能呢?原来这是Chrome隐身模式!那么这个隐身模式有什么功能呢? Chrome隐身模式有什么用? 从官方的介绍来看,“隐 ...
- compass做雪碧图
由于最近没什么时间好好写博文,我把用sass做雪碧图的关键点贴出来方便自己记忆: config.rb注释 # Set this to the root of your project when dep ...
- 51nod 约数和(数论)
题目链接: 约数和 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 有三个下标从1到n的数组a.b.c. a数组初始全为0. b[i]=∑j|ia[j] c[i]=∑j|ib[j] ...
- a href 相对路径 与绝对路径
<a href="/abc/">内容</a> <a href="abc/">内容</a>的区别,相对路径绝对路径 ...
- jQuery异步分页插件
学校软件工程让写课程设计(其实就是自选语言做个项目),感觉都是重复的东西就没有很认真的去写内容,更加注意写一些之前没有用过的东西. 因为一直都使用TP框架来写PHP,TP又自带分页类,想到这里就想试试 ...