客户端状态包含的属性能够分为两类: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;
}
复制代码
固定缓冲区 服务器
配置网络