redis的客戶端和服務器介紹


一.客戶端

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

復。

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

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

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_MASTER

#客戶端正在被列表命令阻塞
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文件的偽客戶端,知道文件載入完成關閉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM