前些天主要看了redis底層依賴的一些資料結構和事件管理庫的**,比較零散,但大體上了解了作者的設計思路.
對不同規模【n】的資料採用不同的資料結構以實現對記憶體利用的"最優",這裡的最優我想作者也沒有做過嚴格的實驗,不同的應用場景在redis上的表現肯定有所不同,如果有必要,可以再配置檔案中對一些閾值做調整,比如 hash-max-zipmap-entries和 hash-max-zipmap-value,這兩個引數決定了在一定資料規模的時候,是用zipmap作為雜湊表資料結構還是dict。
好了,開始介紹redis在沒有異常的情況下預設的整個工作流程,從main函式開始:
1. 初始化serverconfig
初始化redisserver的成員為預設值,如預設埠號,db數量,是否是守護程序,初始化server.commands2. 讀配置檔案
從引數中指定的配置檔案一行行獲取配置資訊,配置檔案最大為1024行~3. 設定守護程序
讀取完配置後,如果配置中的daemonize為1,則設定redis為守護程序【弒父認1為父】4. 執行initserver
a. 初始化對某些訊號的處理方式5. 設定ae時間管理每乙個loop前要執行的方法 beforesleepb. 註冊三類事件到ae:
分別是定時事件,執行servercron, 列印redis各個db的狀態資訊,試探得進行rehashing擴容,關閉超時的client, 刪除過期的key【if master】,連線master【if client,%10】,修改cron計數資訊,返回下次迴圈的時間,
埠監聽事件,accepttcphandler,當前來連線的fd可讀時,讀query並進行處理
unix埠監聽事件,acceptunixhandler
6.開始進入時間管理
Redis原始碼研究 Redis的RESP協議
redis客戶端和服務端互動使用的是redis作者制定的乙個協議,叫resp redis serialization protocol 具體分如下幾個層次 客戶端發給服務端的命令都會序列化為array,而服務端返回給客戶端的可以為如上任意一種型別,各簡單舉例如下 具體介紹參考 請求響應模式有兩種特殊...
Redis 原始碼學習之 Redis 事務Nosql
redis事務提供了一種將多個命令請求打包,然後一次性 按照順序地執行多個命令的機制,並且在事務執行的期間,伺服器不會中斷事務而去執行其他不在事務中的命令請求,它會把事務中所有的命令都執行完畢才會去執行其他的命令。howredis中提供了multi discard exec watch unwatc...
Redis原始碼分析 intset h c
intset.h c 是redis 的整數set實現,intset的結構體如下 基本結構 typedef struct intset intset intset的第乙個成員encoding,表明contents中的儲存資料的資料長度,可以是16bits,32bits,64bits。第二個成員leng...