客户端
struct redisServer{
……
list *clients;
……
}
通用属性
typedef struct redisClient{
……
//通用属性
int fd
robj *name
int flags
sds querybuf
robj **argv
int argc
struct redisCommand *cmd
char buf[REDIS_REPLY_CHUNK_BYTES]
int bufpos
list *reply
int authenticated
time_t ctime
time_t lastinteraction
time_t obuf_soft_limit_reached_time
}
说明:
fd : 客户端正在使用的套接字描述符;-1表示伪客户端,来源于AOF文件或Lua脚本,为客户端不需要网络,所以不需要套接字,自然不需要套接字描述符;普通客户端的fd属性大于-1。
name: 默认情况下,客户端没有名字。通过CLIENT setname设置客户端名字。name属性将指向一个字符串对象。
flags : 客户端标志
客户端角色标志名 | 说明 |
---|---|
REDIS_MASTER | 表示客户端代表的是一个主服务器 |
REDIS_ SLAVE | 表示客户端代表的是一个从服务器 |
REDIS_ PRE_PSYNC | 标志客户端代表的是一个版本低于2.8的从服务器,主服务器不能使用PSYNC命令与这个从服务器进行同步,且这个标志只能在REDIS_SLAVE处于打开时状态时使用 |
REDIS_ LUA_CLIENT | 表示客户端时专门用于处理Lua脚本里面包含的Redis命令的伪客户端 |
客户端状态标志名 | 说明 |
---|---|
REDIS_MONITOR | 表示客户正在执行MONITOR命令 |
REDIS_ UNIX_SICKET | 表示服务器使用UNIX道街在来连接客户端 |
REDIS_ BLOCKED | 表示客户端正在被BRPOP、BLPOP等命令阻塞 |
REDIS_UNBLOCKED | 表示客户端已经从REDIS_ BLOCKED标志所表示的阻塞状态脱离出来。该标志只能在REDIS_ BLOCKED标志打开的情况下使用 |
REDIS_MULTI | 表示客户端正在执行事务 |
REDIS_DIRTY_CAS | 表示使用WATCH命令监视的数据库键已被修改,该标志只能在REDIS_MULTI标志打开的情况下使用 |
REDIS_DIRTY_EXEC | 表示命令在入队时发生错误该标志只能在REDIS_MULTI标志打开的情况下使用 |
REDIS_CLOSE_ASAP | 表示客户端的输出缓冲区大小超出了服务器允许的范围,服务器会在下一次执行serverCon时关闭这个客户端,积存在缓冲区中的数据会被全部释放。 |
REDIS_CLOSE_AFTER_REPLY | 有用户对客户端执行了CLIENT KILL命令,或客户端发送给服务器的命令请求中包含了错误的协议,服务器会将客户端积存在输出缓冲区中的数据全部发送给客户端,然后关闭客户端 |
REDIS_ASKING | 表示客户端向集群节点发送了ASKING命令 |
REDIS_FORCE_AOF | 强制服务器将当前执行的命令写入到AOF文件里 |
REDIS_FORCE_REPL | 强制服务器将当前执行的命令复制给所有从服务器 |
REDIS_MASTER_FORCE_REPLY | 若从服务器想要像主服务器发送REPLICATION ACK命令,则必须打开此标志,否则发送操作会被拒绝执行 |
flags形式: flags = 0000 0110 = CLIENT_MASTER | CLIENT_MONITOR
querybuf : 输入缓冲区,其大小会根据输入内容动态的缩小或者扩大,但不能超过1GB,否则会关闭这个客户端。以SDS形式保存。
argv,argc : argv是一个数组,数组中的每个对象都是一个字符串对象。其中argv[0]就是要执行的命令,之后是传入的参数。argc表示数组的长度
cmd: 指向redisCommand结构。cmd、argv、argc保存的参数,就可以执行客户端指定的命令。
buf:固定大小的输出缓冲区,用于保存长度比较小的回复。默认大小为16 * 1024,即16KB
bufpos:存储数据的大小
relpy: 可变大小的输出缓冲区,是一个链表,连接字符串对象,用于保存长度比较大的回复。
authenticated:身份验证,0表示未通过身份验证,1表示通过了身份验证。
ctime:创建客户端的时间
lastinteraction:客户端与服务器最后一次进行互动的时间。
obuf_soft_limit_reached_time:记录了输出缓冲区第一次到达软性限制(soft limit)的时间。
普通客户端的创建于关闭
创建:
客户端使用connect连接服务器时,服务器就会调用连接应答处理器,为客户端创建相应的客户端,将这个新的客户端状态添加到服务器状态结构的clients链表末尾。
关闭:
- 客户端进程退出或者被杀死,客户端与服务器之间的网络连接被关闭,从而造成客户端被关闭;
- 客户端向服务器发送的命令包含了错误的协议格式;
- 客户端成为CLIENT KILL命令的目标;
- 如果用户设置了timeout配置选项,则客户端空转时间超过了timeout值时,会被关闭(例外情况:客户端是主服务器、从服务器、正在被BLPOP等命令阻塞、或者正在执行SUBSCIRBE/PSUBSCRIBE等订阅命令);
- 客户端发送的请求命令大于输入缓存区限制的大小;
- 发送给客户端的回复命令大小超过了缓冲区限制的大小;
服务器限制客户端缓冲区模式:
模式 | 说明 |
---|---|
硬性限制 | 如果输出缓冲区的大小超过了硬性限制所设置的大小,服务器会立即关闭客户端 |
软性限制 | 如果输出缓冲区的大小超过了软件限制的大小,但没有超过硬性限制的大小,那么客户端会在obuf_soft_limit_reached_time中记录客户端到达软性限制的起始时间,继续监视客户端,如果输出缓冲区一直超出软性限制且时间超过了服务器所设置的时长,则服务器将关闭客户端,否则obuf_soft_limit_reached_time会被清零,客户端不会被关闭 |
伪客户端
- lua脚本的伪客户端: 在服务器运行的整个生命期中会一直存在,知道服务器被关闭;
- AOF文件的伪客户端:在载入工作开始时动态创建,载入完毕后关闭。