濮阳杆衣贸易有限公司

主頁 > 知識庫 > Redis服務(wù)器的啟動過程分析

Redis服務(wù)器的啟動過程分析

熱門標(biāo)簽:江西南昌百應(yīng)電話機器人 隨州營銷電話機器人怎么樣 400電話申請怎么看 hbuilder地圖標(biāo)注 高德地圖標(biāo)注商家在哪 機器人電話機創(chuàng)意繪畫 400電話從哪里申請濱州 天音通信電話機器人 杭州400電話如何申請的

本文將通過分析代碼來介紹Redis的啟動過程,通過查看Redis 的啟動腳本,得知Redis的啟動時從Redis.c的main方法開始的。Redis啟動可以分為以下幾個步驟:

1.初始化Redis服務(wù)器全局配置
2.重置服務(wù)器Save參數(shù)(具體下文詳解)和加載配置文件
3.初始化服務(wù)器
4.加載數(shù)據(jù)庫
5.開始網(wǎng)絡(luò)監(jiān)聽

一,初始化Redis服務(wù)器全局配置。這一步驟主要是主要是根據(jù)Redis.h中設(shè)置的Static值來初始化Redis服務(wù)器配置,這里設(shè)置是Redis服務(wù)器的默認(rèn)配置。如:

·TCP Port,Redis Client的缺省Timeout;
·Redis缺省的數(shù)據(jù)庫數(shù)目;
·Redis Append 持久化方式的參數(shù)設(shè)置;
·Redis的所支持的各種數(shù)據(jù)結(jié)構(gòu)的缺省值的設(shè)置;
·Redis內(nèi)存Swap相關(guān)設(shè)置;
·Redis Master Slave相關(guān)的配置;
·Redis Command Table初始化。

 二,加載配置文件:

這一步是通過讀取的配置文件來對Redis服務(wù)器進(jìn)行設(shè)置,將會覆蓋上一步的某些缺省設(shè)置。打開下載下來的Redis源代碼,我們可以看到其根目錄下有一個默認(rèn)的配置文件redis.conf。需要注意的是,如果在啟動Redis的時候沒有指定配置文件,則Redis服務(wù)器在啟動的時候是不會加載這個默認(rèn)的配置文件進(jìn)行配置的。而且這個默認(rèn)的配置文件和第一步中得全局默認(rèn)缺省配置不盡相同,比如針對Redis的Append模式的數(shù)據(jù)保存策略的配置,redis.conf里面的設(shè)置是:

save 900 1 -------15分鐘內(nèi)一次更新
save 300 10 ------5分鐘內(nèi)10次更新
save 60 10000 ---1分鐘內(nèi)10000次更新。

而上一步里面的默認(rèn)缺省配置確實:

save 60*60 1 -------一個小時內(nèi)1次更新
save 300 100 ------5分鐘內(nèi)100次更新
save 60 10000 ---1分鐘內(nèi)10000次更新。

因此我們在啟動Redis的時候如果默認(rèn)配置不能滿足要求,則需要指明配置文件進(jìn)行配置。

三,初始化服務(wù)器:

初始化服務(wù)器是在initServer()方法中完成的,次方法利用上兩步設(shè)置的參數(shù)進(jìn)一步初始化服務(wù)器:

·創(chuàng)建用來維護(hù)clients和slaves的list
·創(chuàng)建共享對象。redisObject這個struct里有個變量叫做refcount,這個變量就是用來實現(xiàn)共享的。Redis的對象目前Redis只支持共享StringObject。Redis的共享對象有兩大類比:第一類:Redis server的各種操作需要經(jīng)常用到的各類對象,如:Redis Command的分隔符 "\r\n",用于Redis command的reply的"+OK\r\n"或者"-ERR\r\n"等對象,因為在Redis的各種操作這類對象要被頻繁使用,所以就在啟動Redis的時候創(chuàng)建好,然后共用這些對象,減少時間成本和空間成本;第二,類的共享對象就是對應(yīng)于數(shù)字的StringObject,如:Set "olylakers1" 1234; Set "olylakes2" 1234;在Redis內(nèi)部,"olylakers1"和"olylakers2"這兩個key都指向由數(shù)字1234轉(zhuǎn)化的StringObject。這樣在海量數(shù)據(jù)和特定存儲內(nèi)容下,可以節(jié)省大量的內(nèi)存空間??捎猛ㄟ^REDIS_SHARED_INTEGERS這個參數(shù)來指定Redis啟動的時候創(chuàng)建多少個第二類共享對象,默認(rèn)的參數(shù)是10000,即創(chuàng)建的StrongObject個取值范圍是0-9999之間。

·創(chuàng)建Pub/Sub通道
·初始化網(wǎng)絡(luò)監(jiān)聽EventLoop的相關(guān)內(nèi)容,如eventLoop,timeEvent,fileEvent等
·如果開啟了VM,則初始化虛擬內(nèi)存相關(guān)的IO/Thread

四,加載數(shù)據(jù):

根據(jù)配置的不同,Redis加載數(shù)據(jù)的源也不一樣,如果在配置文件里設(shè)置了appendonly  yes(默認(rèn)是no),那么就從appendfile加載數(shù)據(jù),反之則從RedisDb加載數(shù)據(jù)

·從appendfile加載數(shù)據(jù):我們先來看一下appendfile的內(nèi)容是什么。下面的一條記錄摘取自appendfile:SET $9 olylakers $3 oly。很顯,appendfile保存的就是redis server接收到的各種命令,那么從appendfile加載數(shù)據(jù)就是redis server從appenfile里面讀取這些命令的記錄,然后重新把這些命令執(zhí)行一遍即可。需要注意的是,如果開啟了VM,那么在從appendfile加載數(shù)據(jù)的時候可能要涉及swap操作。
·從redisdb加載數(shù)據(jù):如果沒有開啟appendonly,那么則需要從db file加載數(shù)據(jù)到內(nèi)存,其過程是:
1.通過處理select命令,選擇DB
2.然后從db file讀取key和value
3.檢查key是否過期,如果過期則跳過這個key,如果不過期,則把數(shù)據(jù)Add到對應(yīng)的db的dict中
4.如果開啟了VM,則從db file中l(wèi)oad數(shù)據(jù),也可能涉及到swap操作

五,開始網(wǎng)絡(luò)監(jiān)聽:

Redis的網(wǎng)絡(luò)監(jiān)聽沒有采用libevent等,而是自己實現(xiàn)了一套簡單的機遇event驅(qū)動的API,具體見ae.c。

標(biāo)簽:招商 保定 沈陽 常德 石嘴山 昆明 葫蘆島 鶴崗

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis服務(wù)器的啟動過程分析》,本文關(guān)鍵詞  Redis,服務(wù)器,的,啟動,過程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis服務(wù)器的啟動過程分析》相關(guān)的同類信息!
  • 本頁收集關(guān)于Redis服務(wù)器的啟動過程分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    五指山市| 定安县| 当阳市| 杭锦后旗| 巴南区| 化州市| 滨州市| 濉溪县| 盖州市| 太保市| 武宣县| 沁水县| 确山县| 温宿县| 通化市| 晴隆县| 太仓市| 惠东县| 岳池县| 木里| 芷江| 莫力| 娄底市| 得荣县| 都江堰市| 永仁县| 自治县| 白河县| 电白县| 通许县| 大宁县| 宁夏| 玛曲县| 大姚县| 红桥区| 普宁市| 浮山县| 颍上县| 济源市| 博湖县| 博客|