客户端属性:
套接字描述符: redisClient.fd属性值可以是-1或者是大于-1的整数
伪客户端的fd属性值是-1,伪客户端处理的命令请求来源于载入AOF文件或者lua脚本,而不是网络,所以这种客户端不需要套接字连接,自然也不需要记录套接字描述符。
普通客户端的fd属性大于-1,因为它要通过套接字来于服务器进行通信,所有服务器会用fd属性来记录客户端套接字的描述符
输入缓冲区:redisClient.querybuf,用来保存客户端的请求命令
命令参数:redisCilent.argv和redisClient.argc,argv是一个数组,服务器将请求的参数保存到输入缓冲区后,并对其进行分析,分析后的命令参数保存在argv中,命令参数的个数保存在argc中。
输出缓冲区:用来保存命令的回复结果,每个客户端都有两个输出缓冲区,一个缓冲区是固定的,另一个是可变的,最大不能超过1GB,否则关闭客户端连接。
固定大小的缓冲区:用来保存那些长度比较小的回复,比如OK,简短的字符串,整数值,错误回复等,固定缓冲区默认大小是16*1024,即16kb
可变大小缓冲区:用来保存那些长度比较大的回复。
为了避免客户端的回复过大,占用服务器资源,redis服务器使用两种模式来限制输出缓冲区大小
1、硬性模式限制(hard limit):如果输出缓冲区大小超出硬性模式设置的大小,服务器立即关闭客户端
2、软性模式限制(soft limit):如果输出缓冲区超出了软性缓冲区设置的大小,但是没有超出硬性限制设置的大小,那么服务器会记录客户端到达软性限制的起始时间,当在一定时间内,客户端的输出缓冲区一直超出软性限制的大小,那么服务器会关闭客户端连接。
可以通过client-output-buffer-limit命令设置硬性和软性模式限制。
语法:client-output-buffer-limit
示例(默认值):
//普通客户端的限制,最大不能超过1GB,否则关闭客户端连接
client-output-buffer-limit normal 0 0 0
//从服务器客户端的限制
client-output-buffer-limit slave 256mb 64mb 60
//带有发布和订阅功能的客户端限制
client-output-buffer-limit pubsub 32mb 8mb 60
身份验证:redisClient.authenticated,只有当开启身份验证后,该属性才可用,1:通过,0:未通过
客户端的连接信息查看
输入命令 client list
返回结果:id=2 addr=127.0.0.1:65025 fd=9 name= age=34924 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
fd:文件描述符
name:名字,默认情况下,一个连接到服务端的客户端是没有名字的,可以通过client setname 命令设置
age:以秒计算的已连接时长
idle:以秒计算的空闲时间
flags:记录了客户端的角色以及目前所处的状态,取值如下:
O : 客户端是 MONITOR 模式下的附属节点(slave)
S : 客户端是一般模式下(normal)的附属节点
M : 客户端是主节点(master)
x : 客户端正在执行事务
b : 客户端正在等待阻塞事件
i : 客户端正在等待 VM I/O 操作(已废弃)
d : 一个受监视(watched)的键已被修改, EXEC 命令将失败
c : 在将回复完整地写出之后,关闭链接
u : 客户端未被阻塞(unblocked)
A : 尽可能快地关闭连接
N : 未设置任何 flag
db:客户端使用的数据库id
sub:已订阅频道的数量
psub:已订阅模式的数量
multi:在事务中执行的命令数量
qbuf:查询缓冲的长度,长度为0,代表没有分配查询缓冲区
qbuf-free:查询缓冲区的剩余空间长度
obl:输出缓冲区的长度
oll:输出列表包含的对象数量,当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里
omem:输出缓冲区和输出列表占用的内存总量
events:文件描述符事件,r=readable,w=writeable
cmd:最近一次执行的命令