對(duì)于每個(gè)與服務(wù)器進(jìn)行連接的客戶端,服務(wù)器都為其建立了相對(duì)應(yīng)的redis.h/redisClient結(jié)構(gòu)(客戶端狀態(tài))仁讨,這個(gè)結(jié)構(gòu)保存了客戶端當(dāng)前的狀態(tài)信息,以及執(zhí)行相關(guān)功能時(shí)需要用到的數(shù)據(jù)結(jié)構(gòu)。
redis服務(wù)器狀態(tài)結(jié)構(gòu)的clients屬性是一個(gè)鏈表瘦馍,這個(gè)鏈表保存了所有與服務(wù)器連接的客戶端的狀態(tài)結(jié)構(gòu)。
客戶端的一些屬性
客戶端的一些屬性应役,都保存在redisClient結(jié)構(gòu)里面情组。
- fd(int fd):fd屬性記錄了客戶端正在使用的套接字描述符。偽客戶端的fd屬性的值為-1.偽客戶端處理的命令請(qǐng)求來(lái)源于AOF文件或者Lua腳本箩祥,而不是網(wǎng)絡(luò)院崇。
- 名字(robj *name):默認(rèn)情況下,客戶端是沒(méi)有名字的袍祖。
- 標(biāo)志(int flags):記錄了客戶端的角色(role)底瓣,以及客戶端目前所處的狀態(tài)。
- 輸入緩沖區(qū)(sds querybuf):用來(lái)保存客戶端發(fā)送的命令請(qǐng)求蕉陋。最大大小不能超過(guò)1GB捐凭,否則服務(wù)器將關(guān)閉這個(gè)客戶端。
- 命令與命令參數(shù)(robj **argv凳鬓, int argc):argv屬性是一個(gè)數(shù)組茁肠,數(shù)組每個(gè)項(xiàng)都是一個(gè)字符串對(duì)象,其中argv[0]是要執(zhí)行的命令缩举,之后的其他項(xiàng)則是傳給命令的參數(shù)垦梆。argc屬性負(fù)責(zé)記錄argv數(shù)組的長(zhǎng)度匹颤。
- 命令的實(shí)現(xiàn)函數(shù)(redisCommand *cmd):有一個(gè)命令表,其是一個(gè)字典托猩,字典的鍵是一個(gè)SDS結(jié)構(gòu)印蓖,保存了命令的名字,值為命令所對(duì)應(yīng)的redisCommand結(jié)構(gòu)京腥。redisCommand這個(gè)結(jié)構(gòu)保存了命令的實(shí)現(xiàn)函數(shù)另伍,命令的標(biāo)志,命令應(yīng)該給定的參數(shù)個(gè)數(shù)绞旅,命令的總執(zhí)行次數(shù)和總消耗時(shí)長(zhǎng)等統(tǒng)計(jì)信息摆尝。當(dāng)程序在命令表中成功找到argv[0]所對(duì)應(yīng)的redisCommand結(jié)構(gòu)時(shí),它會(huì)將客戶端狀態(tài)的cmd指針指向這個(gè)結(jié)構(gòu)因悲。隨后服務(wù)器就可以使用cmd屬性所指向的redisCommand結(jié)構(gòu)堕汞,以及其他命令參數(shù)信息,調(diào)用命令實(shí)現(xiàn)函數(shù)晃琳,執(zhí)行客戶端指定的命令讯检。
- 輸出緩沖區(qū)(char buf[REDIS_REPLY_CHUNK_BYTES], int bufpos):每個(gè)客戶端有兩個(gè)輸出緩沖區(qū)可用卫旱,一個(gè)大小是固定的(用來(lái)保存那些長(zhǎng)度比較小的回復(fù)人灼,比如OK,簡(jiǎn)短的字符串值顾翼,整數(shù)值投放,錯(cuò)誤回復(fù)等等,最大大小為16KB)适贸。一個(gè)大小是可變的灸芳,用于保存那些長(zhǎng)度比較大的回復(fù)“葑耍可變大小緩沖區(qū)是由reply鏈表和一個(gè)或多個(gè)字符串對(duì)象組成(最大大小不能超過(guò)服務(wù)器設(shè)置的硬性限制值烙样,或者在一段時(shí)間內(nèi),一直超過(guò)服務(wù)器設(shè)置的軟性限制蕊肥,客戶端都會(huì)被關(guān)閉)谒获。
- 身份驗(yàn)證(int authenticated): authenticated的值為0,表示客戶端未通過(guò)身份驗(yàn)證壁却;authenticated的值為1批狱,表示客戶端已經(jīng)通過(guò)了身份驗(yàn)證。