1鲫懒、命令請(qǐng)求的執(zhí)行過(guò)程
1.1、客戶端向服務(wù)器發(fā)送命令請(qǐng)求set key value
1.2刽辙、服務(wù)器接收并處理客戶端發(fā)送來(lái)的命令窥岩,在數(shù)據(jù)庫(kù)中進(jìn)行設(shè)置,并產(chǎn)生命令回復(fù)
1.3宰缤、服務(wù)器將命令回復(fù)發(fā)送給客戶端
1.4颂翼、客戶端收到服務(wù)器命令回復(fù)晃洒,并將這個(gè)回復(fù)打印給用戶
2、發(fā)送命令請(qǐng)求
客戶端會(huì)將命令請(qǐng)求轉(zhuǎn)換成協(xié)議格式朦乏,然后通過(guò)連接到服務(wù)器的套接字球及,將協(xié)議格式的命令請(qǐng)求發(fā)送給服務(wù)器
3、讀取命令請(qǐng)求
1)呻疹、讀取套接字中協(xié)議格式的命令請(qǐng)求吃引,并將其保存到客戶端狀態(tài)的輸入緩沖區(qū)里面
2)、對(duì)緩沖區(qū)中的命令請(qǐng)求進(jìn)行分析诲宇,提取出命令請(qǐng)求中包含的命令參數(shù)际歼,以及命令參數(shù)的個(gè)數(shù),然后分別保存到客戶端狀態(tài)的argv屬性和argc屬性里面
3)姑蓝、調(diào)用命令執(zhí)行器鹅心,執(zhí)行客戶端制定命令
3、命令執(zhí)行器
1)纺荧、首先根據(jù)客戶端狀態(tài)的argv[0]參數(shù)旭愧,在命令表(command table) 中查找參數(shù)所指定的命令,并將找到的命令保存到客戶端狀態(tài)的cmd屬性里面宙暇,命令表是一個(gè)字典
命令名字大小寫(xiě)不影響結(jié)果
2)输枯、執(zhí)行預(yù)備操作
檢查cmd指針是否指向null,null則不執(zhí)行后續(xù)步驟
cmd找到redisCommand結(jié)構(gòu)的artity屬性,檢查命令請(qǐng)求所給定的參數(shù)個(gè)數(shù)是否正確占贫,比如artity=-3桃熄,那么輸入?yún)?shù)個(gè)數(shù)必須大于等于3
驗(yàn)證身份
如果開(kāi)啟maxmemory功能,那么檢查內(nèi)存占用情況型奥,需要時(shí)瞳收,進(jìn)行回收
如果客戶端正在使用subscribe命令訂閱頻道,或者正在用psubscribe訂閱厢汹,那么服務(wù)器只會(huì)執(zhí)行客戶端發(fā)來(lái)的subscribe psubscribe unsubscribe unpsubscribe
如果服務(wù)器正在進(jìn)行數(shù)據(jù)載入螟深,那么客戶端發(fā)送命令必須帶有標(biāo)志1
如果服務(wù)器因?yàn)閳?zhí)行l(wèi)ua腳本而超時(shí)并進(jìn)入阻塞狀態(tài),那么服務(wù)器只會(huì)執(zhí)行客戶端發(fā)來(lái)的shutdown nosave 和 script kill 命令烫葬,其他被拒絕
如果服務(wù)器正在執(zhí)行事務(wù)界弧,那么服務(wù)器只會(huì)執(zhí)行客戶端發(fā)來(lái)的exec discard multi watch 四個(gè)命令,其他的被放進(jìn)事物隊(duì)列
如果服務(wù)器打開(kāi)監(jiān)視器功能搭综,則將要執(zhí)行的命令發(fā)送給監(jiān)視器
當(dāng)完成以上預(yù)備操作之后垢箕,服務(wù)器就可以開(kāi)始真正執(zhí)行命令了
3)、調(diào)用命令的實(shí)現(xiàn)函數(shù)
4)兑巾、執(zhí)行后續(xù)工作
如果開(kāi)啟慢日志查詢舰讹,則判斷是否需要記錄慢日志
根據(jù)命令所耗費(fèi)時(shí)長(zhǎng),更新被執(zhí)行命令的redisCommand結(jié)構(gòu)的milliseconds屬性闪朱,并將命令的redisCommand結(jié)構(gòu)的calls計(jì)數(shù)器的值增一
如果開(kāi)啟aof持久化月匣,則寫(xiě)入aof緩沖區(qū)
如果從服務(wù)器正在復(fù)制當(dāng)前服務(wù)器,則服務(wù)器將執(zhí)行的命令傳播給所有從服務(wù)器
4奋姿、serverCron函數(shù)
serverCron函數(shù)默認(rèn)每隔100毫秒執(zhí)行一次锄开,這個(gè)函數(shù)負(fù)責(zé)管理服務(wù)器的資源,并保持服務(wù)器自身運(yùn)作良好
serverCron每隔100毫秒一次的頻率更新unixtime屬性和mstime屬性称诗,當(dāng)前時(shí)間萍悴,所以這兩個(gè)屬性記錄的時(shí)間精度不高
5、初始化服務(wù)器
1)寓免、初始化服務(wù)器狀態(tài)結(jié)構(gòu)
2)癣诱、載入配置選項(xiàng)
3)、初始化服務(wù)器數(shù)據(jù)結(jié)構(gòu)
4)袜香、還原數(shù)據(jù)庫(kù)狀態(tài)