redis-客戶端

客戶端屬性

客戶端狀態包含的屬性能夠分爲兩類:redis

一類是比較通用的屬性, 這些屬性不多與特定功能相關, 不管客戶端執行的是什麼工做, 它們都要用到這些屬性。 另一類是和特定功能相關的屬性, 好比操做數據庫時須要用到的 db 屬性和 dictid 屬性, 執行事務時須要用到的 mstate 屬性, 以及執行 WATCH 命令時須要用到的 watched_keys 屬性, 等等。 本章將對客戶端狀態中比較通用的那部分屬性進行介紹, 至於那些和特定功能相關的屬性, 則會在相應的章節進行介紹數據庫

typedef struct redisClient {

    // ...

    int fd;

    // ...

} redisClient;
複製代碼

根據客戶端類型的不一樣, fd 屬性的值能夠是 -1 或者是大於 -1 的整數:數組

僞客戶端(fake client)的 fd 屬性的值爲 -1 : 僞客戶端處理的命令請求來源於 AOF 文件或者 Lua 腳本, 而不是網絡, 因此這種客戶端不須要套接字鏈接, 天然也不須要記錄套接字描述符。 目前 Redis 服務器會在兩個地方用到僞客戶端, 一個用於載入 AOF 文件並還原數據庫狀態, 而另外一個則用於執行 Lua 腳本中包含的 Redis 命令。 普通客戶端的 fd 屬性的值爲大於 -1 的整數: 普通客戶端使用套接字來與服務器進行通信, 因此服務器會用 fd 屬性來記錄客戶端套接字的描述符。 由於合法的套接字描述符不能是 -1 , 因此普通客戶端的套接字描述符的值必然是大於 -1 的整數。 執行 CLIENT_LIST 命令能夠列出目前全部鏈接到服務器的普通客戶端, 命令輸出中的 fd 域顯示了服務器鏈接客戶端所使用的套接字描述符:緩存

  • addr:地址及端口
  • fd:套接字描述符
  • name: 可使用client setname 設置某個連接的名稱
  • age: 連接的時間,單位秒
  • idle:空閒時間,單位秒
  • flags:記錄了客戶端的角色(role)
# 客戶端是一個主服務器
REDIS_MASTER

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

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

# 客戶端是一個從服務器,而且版本低於 Redis 2.8
REDIS_SLAVE | REDIS_PRE_PSYNC

# 這是專門用於執行 Lua 腳本包含的 Redis 命令的僞客戶端
# 它強制服務器將當前執行的命令寫入 AOF 文件,並複製給從服務器
REDIS_LUA_CLIENT | REDIS_FORCE_AOF | REDIS_FORCE_REPL
複製代碼

輸入緩衝區

typedef struct redisClient{
    sds querybuf;
}redisClient
複製代碼
  • 輸入緩存區的大小會根據輸入內容動態的縮小或者擴大,但它的最大大小不能超過1GB,不然服務器將關閉這個客戶端。

命令與參數

typedef struct redisClient{
    robj **argv;
    int argc;
}redisClient
複製代碼
  • argv屬性是一個數組,數組中的每一個項都是一個字符串對象,其中argv[0]是要執行的命令,而以後的其餘項則傳給命令的參數。
  • argc屬性則負責記錄argv數組的長度

命令的實現函數

舉例命令:set key value 直接看圖: 安全

輸出緩衝區

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

  • 固定大小的緩衝區用於保存那些長度比較小的回覆,好比ok、簡短的字符串值、整數值、錯誤回覆等等。
  • 可變大小的緩衝區用於保存那些長度比較大的回覆,好比一個很是長的字符串值,一個由不少項組成的列表,一個包含了不少元素的集合等等。
typedef struct redisClient{
    char buf[REDIS_REPLY_CHUNK_BYTES];
    
    int bufpos;
    
    list *reply;
}
複製代碼
  • buf數組,REDIS_REPLY_CHUNK_BYTES默認值16*1024,大小爲16KB
  • bufpos記錄buf數組使用字節的數量
  • reply是一個鏈表

固定緩衝區 服務器

可變緩衝區

身份驗證

  • authenticated:0未驗證,1已驗證經過
  • requirepass:配置此屬性是的打開驗證

客戶端的建立與關閉

何時客服端關閉

  • 客戶端退出或者被殺死
  • 客戶端發送不符合協議格式的命令,被服務端關閉
  • 被 client kill
  • 服務器設置了timeout
  • 輸入緩衝區大於限制大小,默認1GB
  • 回覆的命令大於輸入緩衝區的限制

配置網絡

  • clinet-output-buffer-limit normal 0 0 0 :表示不限制客戶端的輸出緩衝區大小
  • clinet-output-buffer-limit slave 256mb 64mb 60 :硬性設置256MB,軟性設置爲64MB,軟性限制的時長60秒
  • clinet-output-buffer-limit pubsub 32mb 8mb 60 :發佈與訂閱硬性限制32MB,軟性限制8MB,軟性相紙的時長爲60秒

僞客戶端

  • lua腳本
  • AOF文件:服務器載入AOF文件時

重點

  • 服務器狀態結構使用 clients 鏈表鏈接起多個客戶端狀態, 新添加的客戶端狀態會被放到鏈表的末尾。
  • 客戶端狀態的 flags 屬性使用不一樣標誌來表示客戶端的角色, 以及客戶端當前所處的狀態。
  • 輸入緩衝區記錄了客戶端發送的命令請求, 這個緩衝區的大小不能超過 1 GB 。 命令的參數和參數個數會被記錄在客戶端狀態的 argv 和 argc 屬性裏面, 而 cmd 屬性則記錄了客戶端要執行命令的實現函數。
  • 客戶端有固定大小緩衝區和可變大小緩衝區兩種緩衝區可用, 其中固定大小緩衝區的最大大小爲 16 KB , 而可變大小緩衝區的最大大小不能超過服務器設置的硬性限制值。
  • 輸出緩衝區限制值有兩種, 若是輸出緩衝區的大小超過了服務器設置的硬性限制, 那麼客戶端會被當即關閉; 除此以外, 若是客戶端在必定時間內, 一直超過服務器設置的軟性限制, 那麼客戶端也會被關閉。
  • 當一個客戶端經過網絡鏈接連上服務器時, 服務器會爲這個客戶端建立相應的客戶端狀態。 網絡鏈接關閉、 發送了不合協議格式的命令請求、 成爲 CLIENT_KILL 命令的目標、 空轉時間超時、 * * 輸出緩衝區的大小超出限制, 以上這些緣由都會形成客戶端被關閉。 處理 Lua 腳本的僞客戶端在服務器初始化時建立, 這個客戶端會一直存在, 直到服務器關閉。
  • 載入 AOF 文件時使用的僞客戶端在載入工做開始時動態建立, 載入工做完畢以後關閉。
相關文章
相關標籤/搜索