redis的客戶端和服務器介紹

一.客戶端

redis服務器是典型的一對多服務器程序:一個服務器能夠與多個客戶端創建網絡鏈接,每一個客戶端能夠向服務器發送命令請求,而服務器則接收並處理客戶端發送的命令請求,並向客戶端返回命令回redis

復。數組

經過使用由I/O多路複用技術實現的文件事件處理器,redis服務器使用單線程單進程的方式來處理命令請求,並與多個客戶端進行網路通訊。安全

對於每一個與服務器進行鏈接的客戶端,服務器都爲這些客戶端創建了相應的redisClient結構(客戶端狀態),這個結構保存了客戶端當前的狀態信息,以及執行相關功能是須要的數據結構,包括客戶端的名字,客戶端的套接字描述符等。bash

redis服務器狀態結構的clients屬性是一個鏈表,這個鏈表保存了全部與服務器鏈接的客戶端狀態結構,對客戶端執行批量操做,或者查找某個指定的客戶端,均可以經過遍歷clients鏈表來完成。服務器

1.1 客戶端狀態的屬性:

typedef struct redisClent{
//...

int fd;
robj *name;
int flags;
sds querybuf;
robj **argv;
int argc;
struct redisCommand *cmd;
char buf[REDIS_REPLY_CHUNK_BUYTES];
int bufpos;
int authenticated;
time_t ctime;
time_t lastinteraction;
time_t obuf_soft_limit_reached_time; //... }redisClient;

1.套接字描述符 - 客戶端狀態的fd屬性記錄了客戶端正在使用的套接字描述符
根據客戶端類型的不一樣,fd的值能夠是-1或者大於-1的整數:僞客戶端的fd=-1,普通客戶端的fd大於1網絡

2.名字 - 默認狀況下,一個鏈接到服務器的客戶端是沒有名字的,不過能夠在客戶端執行clinet setname命令爲客戶端設置一個名字數據結構

3.標誌 - flags屬性記錄了客戶端的角色,以及客戶端目前所處的狀態,好比:函數

#客戶端是一個主服務器
REDIS_MASTERlua

#客戶端正在被列表命令阻塞
REDIS_BLOCKED線程

#客戶端正在執行事務,但事物的安全性已被破壞
REDIS_MULTI | REDIS_DIRTY_CAS

4.輸入緩衝區 - 保存客戶端發送的命令請求

5.命令與命令參數 - 服務器對命令請求的內容進行分析,並得出的命令參數和命令參數的個數分別保存到客戶端狀態的argv和argc屬性

 

 

6.命令的實現函數 - 根據argv[0]的值,去命令表查找對應的命令實現函數

7.輸出緩衝區 - 執行命令所得的命令回覆會被保存在客戶端狀態的輸出緩衝區裏面,每一個客戶端都有兩個輸出緩衝區可用,一個緩衝區的大小是固定的,另外一個緩衝區的大小是可變的.

固定大小的緩衝區用於保存那些長度比較小的回覆,好比ok,簡短的字符串值,整數值,錯誤回覆等。

可變大小的緩衝區用於保存那些長度比較小的回覆,好比一個很是長的字符串值,一個由不少項組成的列表,一個包含了不少元素的集合等等。

buf是一個字節數組,而bufpos記錄了buf數組目前已使用的字節數量。

REDIS_REPLY_CHUNK_BUYTES常量目前的默認值是16*1024,也就是說buf數組的默認大小爲16KB。

8.身份驗證 - 用於記錄客戶端是否經過了身份驗證,authenticated=1表示經過驗證,authenticated屬性僅在服務器啓用了身份驗證功能使用。

9.時間

ctime記錄的是建立客戶端的時間

lastinteraction記錄了客戶端和服務器最後一次進行互動的時間

obuf_soft_limit_reached_time屬性記錄了輸出緩衝區第一次到達軟性限制的時間。

1.2 客戶端的建立與關閉

1.當建立的是普通客戶端時,服務器會爲這個客戶端建立相應的客戶端狀態。當網絡鏈接關閉 或 發送了不合協議格式的命令請求 或 成爲client_kill命令的目標 或 空轉時間超時 或 輸出緩衝區大小超過限制,以上這些緣由會致使客戶端鏈接關閉;

2.用於處理lua腳本的僞客戶端在服務器初始化時候建立,知道服務器關閉;

3.載入aof文件的僞客戶端,知道文件載入完成關閉

相關文章
相關標籤/搜索