Redis服務器的啟動過程分析
來源:易賢網 閱讀:1385 次 日期:2015-04-14 14:00:31
溫馨提示:易賢網小編為您整理了“Redis服務器的啟動過程分析”,方便廣大網友查閱!

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

1.初始化Redis服務器全局配置

2.重置服務器Save參數(具體下文詳解)和加載配置文件

3.初始化服務器

4.加載數據庫

5.開始網絡監聽

一,初始化Redis服務器全局配置。這一步驟主要是主要是根據Redis.h中設置的Static值來初始化Redis服務器配置,這里設置是Redis服務器的默認配置。如:

·TCP Port,Redis Client的缺省Timeout;

·Redis缺省的數據庫數目;

·Redis Append 持久化方式的參數設置;

·Redis的所支持的各種數據結構的缺省值的設置;

·Redis內存Swap相關設置;

·Redis Master & Slave相關的配置;

·Redis Command Table初始化。

二,加載配置文件:

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

save 900 1 -------15分鐘內一次更新

save 300 10 ------5分鐘內10次更新

save 60 10000 ---1分鐘內10000次更新。

而上一步里面的默認缺省配置確實:

save 60*60 1 -------一個小時內1次更新

save 300 100 ------5分鐘內100次更新

save 60 10000 ---1分鐘內10000次更新。

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

三,初始化服務器:

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

·創建用來維護clients和slaves的list

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

·創建Pub/Sub通道

·初始化網絡監聽EventLoop的相關內容,如eventLoop,timeEvent,fileEvent等

·如果開啟了VM,則初始化虛擬內存相關的IO/Thread

四,加載數據:

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

·從appendfile加載數據:我們先來看一下appendfile的內容是什么。下面的一條記錄摘取自appendfile:SET $9 olylakers $3 oly。很顯,appendfile保存的就是redis server接收到的各種命令,那么從appendfile加載數據就是redis server從appenfile里面讀取這些命令的記錄,然后重新把這些命令執行一遍即可。需要注意的是,如果開啟了VM,那么在從appendfile加載數據的時候可能要涉及swap操作。

·從redisdb加載數據:如果沒有開啟appendonly,那么則需要從db file加載數據到內存,其過程是:

1.通過處理select命令,選擇DB

2.然后從db file讀取key和value

3.檢查key是否過期,如果過期則跳過這個key,如果不過期,則把數據Add到對應的db的dict中

4.如果開啟了VM,則從db file中load數據,也可能涉及到swap操作

五,開始網絡監聽:

Redis的網絡監聽沒有采用libevent等,而是自己實現了一套簡單的機遇event驅動的API,具體見ae.c。

更多信息請查看IT技術專欄

更多信息請查看數據庫
易賢網手機網站地址:Redis服務器的啟動過程分析
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
未满十八18勿进黄网站免费看