Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1436276
  • 博文数量: 241
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2253
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:27
个人简介

--

文章分类

全部博文(241)

文章存档

2021年(3)

2019年(6)

2018年(1)

2017年(9)

2016年(21)

2015年(50)

2014年(125)

2013年(26)

我的朋友

分类: LINUX

2015-10-25 17:40:40


点击(此处)折叠或打开

  1. int main()
  2. {
  3.     1、初始化
  4.     srand(time(NULL)^getpid());//根据当前时间异或pid获取随机数种子,srand和rand配合产生伪随机数序列
  5.     
  6.     checkForSentinelMode //获取Sentinel模式,第一个参数有redis-sentinel或是后面有一个是--sentinel则是sentinel模式
  7.     关于sentinel详细说明见:http://redis.readthedocs.org/en/latest/topic/sentinel.html
  8.     
  9.     initServerConfig //初始化服务器配置
  10.     {
  11.         getRandomHexChars 初始化Redis instance id,用于区分是一个新的instance还是之前的instance重启???????
  12.         初始化AOF等系统基本配置默认信息,LRU时钟,主备相关,
  13.         
  14.         commandTableDictType SDS初始化挂接
  15.         populateCommandTable 支持的redisCommandTable的挂接
  16.         
  17.         del、multi、lpush、lpop、rpop命令的提取出来,hash存储??
  18.     }
  19.     
  20.     if server.sentinel_mode
  21.     {
  22.         initSentinelConfig(); //配置端口 26379
  23.         initSentinel(); //添加支持的sentinel命令 sentinelcmds
  24.     }
  25.     
  26.     2、命令行参数解析:
  27.     -v --version version()
  28.     -h --help usage()
  29.     --test-memery 打印提示"Please specify the amount of memory to test in megabytes."退出
  30.     resetServerSaveParams
  31.     loadServerConfig 读取第二个参数,配置文件和选项参数
  32.     {
  33.         从配置文件度读取配置内容,
  34.         loadServerConfigFromString() ,可以配置timeout、tcp-keepalive、port、bind、unixsocket、unixsocketperm等参数
  35.     }
  36.     
  37.     3、初始化server
  38.     if server.daemonize //配置守护进程后台执行
  39.     {
  40.         daemonize()
  41.     }
  42.     initServer() //初始化服务器,设置信号处理函数、事件轮询、监听端口等
  43.     {
  44.         setupSignalHandlers() 信号量初始化
  45.         createSharedObjects() 创建常量池,避免频繁创建、回收的开销
  46.         aeCreateEventLoop() 创建事件轮询
  47.         anetTcpServer() 创建服务器端socket并监听端口,将监听到的fp加入到事件循环队列中
  48.         
  49.         根据DB num逐个初始化DB
  50.         
  51.         定时处理函数以及有新链接时回调函数,每1s执行一次,主要处理一步任务,比如清除expired keys,
  52.         更新统计,check进行rdb、aof子进程的状态,然后会调用clientCron和databaseCron等。 ?????????
  53.         aeCreateTimeEvent( serverCron)
  54.         aeCreateFileEvent() 将监听到的fp加入到事件循环队列中,创建网络io事件(select、epoll,kqueue,evport),并且挂接的处理读写接口acceptTcpHandler()
  55.         
  56.         AOF开关打开了则打开AOF文件
  57.         
  58.         redis是单线程,对于重IO操作,比如aof的fsync的调用会由异步线程调用,避免阻塞主线程的事件循环。
  59.         scriptingInit() Lua脚本等初始化,C中使用Lua脚本初始化,详细信息见scriptingReset()
  60.         slowlogInit();
  61.         bioInit(); bioInit初始化异步io线程,背景线程处理 bioProcessBackgroundJobs()
  62.     }
  63.     
  64.     aeMain() 进入事件轮询
  65.     {
  66.         aeProcessEvents() sleep之前会调用beforeSleep函数,进行一些异步处理,
  67.     }
  68. }

参考资料:
http://blog.csdn.net/chosen0ne/article/details/42686383

http://my.oschina.net/qiangzigege/blog/179672

阅读(1144) | 评论(2) | 转发(0) |
0

上一篇:Redis源码简要分析

下一篇:Redis源码简介

给主人留下些什么吧!~~

alienzf2015-10-25 18:28:48

第三部分就是flushAppendOnlyFile(aof.c:60),这个函 数主要目的是将aofbuf的数据写到文件,那aofbuf是什么呢?他是AOF的一个缓冲区,所以客户端的命令都会在处理完后把这些命令追加到这个缓冲 区中,然后待一轮数据处理完之后统一写到文件(所以aof也是不能100%保证数据不丢失的,因为如果当redis正在处理这些命令的情况下服务就挂掉, 那么这部分的数据是没有保存到硬盘的),大家都知道写数据到文件并不是立即写到硬盘,只是保存到一个文件缓冲区中,什么情况下会把缓冲区的数据转到硬盘 呢?只要满足如下三种条件的一种就能将数据真正存到硬盘:1、手动调用刷新缓冲区;2、缓冲区已满;3、程序正常退出。因此redis将数据写到文件缓冲 区之后会判断是否需要刷到硬盘,server.appendfsync有两种方式,第一种(APPENDFSYNC_ALWAYS):无条件刷新,即每次 写文件都会保存到硬盘,第二种(APPENDFSYNC_EVERYSEC):每隔一秒保存到硬盘。

alienzf2015-10-25 18:28:36

在beforeSleep内部一共有三部分,第一部分对vm进行处理(即第一个if块),这里我们略过;第二部分是释放客户端的阻塞操作,在 redis里有两个命令BLPOP和BRPOP需要使用这些操作(弹出列表头或者尾,实现方式见t_list.c:862行的 blockingPopGenericCommand函数),当指定的key不存在或者列表为空的情况下,那么客户端会一直阻塞,直到列表有数据时,服务 端就会去执行lpop或者rpop并返回给客户端,那么什么时候需要用到BLPOP和BRPOP呢?大家平时肯定用redis做过队列,最常见的处理方式 就是使用llen去判断队列有没有数据,如果有数据就去取N条,然后处理,如果没有就sleep(3),然后继续循环,其实这里就可以使用BLPOP或者 BRPOP来轻松实现,而且可以减少请求,具体怎么实现留给大家思考;