客戶端狀態包含的屬性能夠分爲兩類: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 域顯示了服務器鏈接客戶端所使用的套接字描述符:緩存
# 客戶端是一個主服務器
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
複製代碼
typedef struct redisClient{
robj **argv;
int argc;
}redisClient
複製代碼
舉例命令:set key value 直接看圖: 安全
執行客戶端的回覆會保存在客戶端狀態的輸出緩衝區裏面,每一個客戶端都有兩個輸出緩衝區可用,一個緩存區是固定大小,另外一個緩衝區的大小是可變的bash
typedef struct redisClient{
char buf[REDIS_REPLY_CHUNK_BYTES];
int bufpos;
list *reply;
}
複製代碼
固定緩衝區 服務器
配置網絡