《Redis设计与实现》笔记5
更新日期:
单机数据库实现——客户端
Redis服务器使用clients链表来存储客户端状态结构。
客户端属性,套接字描述符
redisClient的fd属性记录了客户端正在使用的客户端套接字描述符。
- fd=-1,伪客户端,命令请求来源于AOF文件或者lua脚本。
- fd大于-1,普通客户端。
redisClient的lastinteraction可以用来计算客户端的空转时间,使用client list进行查看
客户端创建与关闭
- 普通客户端创建,会在连接服务器时,服务端通过连接事件处理器,为客户端创建客户端状态,并将客户端添加到clients链表结尾。
- 普通客户端的关闭,
- 客户端进程关闭或被杀死
- 客户端向服务器发送带有不符合协议格式的命令请求
- 客户端成为client kill的目标
- 服务器设置timeout配置选项,客户端空转时间超出timeout时会被关闭。例外情况:客户端是主服务器(打开了REDIS_MASTER标志),从服务器(打开了redis_slave标志),正在被blpop等命令阻塞(打开了REDIS_BLOCKED标志),或在执行subscriber、psubscriber等订阅命令,那么即使客户端的空转时间超出timeout值,客户端也不会被服务器关闭
- 客户端发送命令大小超出了输入缓冲区的限制大小(默认1gb)
- 发送给客户端的回复超出了输出缓冲区的大小,具体如下:
- 服务器输出缓冲区限制模式 ,硬性限制、软性限制
- 硬性限制:超出硬性设置大小,立即关闭。
- 软性限制:超出软性设置大小,但没超出硬性设置大小,obuf_soft_limit_reached_time属性纪录客户端到达软性限制的起始时间,之后服务器监视客户端,如果持续超出限制,并达到软性限制超出时间,客户端会被关闭。如果未达到超出时间则不会关闭,obuf_soft_limit_reached_time会被清0。
client_output_buffer_limit配置项可以对相关参数进行配置。