1、redis服务器是一对多服务,通过i/o的多路复用技术实现文件事件处理器,redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信

2、客户端包含的属性分为两类
一类比较通用的属性,无论客户端执行什么工作都要用到这些属性
一类与特定功能相关的属性,比如操作数据库时需要用到的db属性和dictid属性,执行事务时需要用到的mstate属性,以及执行watch时需要用到的watched_keys属性
3、套接字描述
fd可以是-1或者大于-1的整数
fd=-1时,为伪客户端,执行来源于aof文件或者lua脚本,而不是网络
client list记录所有连接到服务器的普通客户端
4、名字,默认没有名字,使用client steName命令之后,使客户端身份更加清晰
5、标志 flags,记录客户端的角色(role)
redis_master标志客户端代表主服务器,redis_slave标志客户端代表一个从服务器
redis_pre_psync标志客户端代表一个版本低于redis2.8的从服务器
redis_LUA_CLIENT标识客户端是专门用于处理lua脚本里面包含的redis命令的伪客户端
另外一些标志客户端目前所处的状态
rediS_MONITOR标志客户端正在执行mornitor命令
redis_unix_socket标志服务器使用unix套接字来连接客户端
redis_blocked标志客户端正在被brpop、blpop等命令阻塞
redis_unblocked标志客户端已经从redis_blocked标志所表示的阻塞状态
redis_multi标志客户端正在执行事务
。。。
6、输入缓冲区
输入缓冲区大小会根据输入内动动态缩小扩大,最大不超过1gb,否则服务器将关闭这个客户端
7、命令与命令参数
argv属性是一个数组,argv[0]表示要执行的命令,后面是命令参数,argc负责记录argv数组的长度
8、命令实现函数
服务器根据argv[0]的值,在命令表中查找到命令所对应的命令实现函数

9、输出缓冲区
两种,一种固定大小,保存哪些长度比较小的回复,比如ok字符串,默认16KB
可变大小的缓冲区,用于保存哪些长度比较大的回复,比如一个非常长的字符串
10、身份验证
客户端authenticated属性0,表示未通过身份验证,1表示通过身份验证
11、时间属性
ctime 表示创建客户端时间,可以计算出客户端已经创建多久
lastinteraction,最后一次互动时间,可以计算空转idle时间
12、创建普通客户端,服务器会将新的客户端状态添加到客户端clients链表的末尾
13、关闭客户端
关闭条件
客户端进程退出或者被杀死
客户端发送带有不符合协议格式的命令请求
客户端成为了client kill命令目标
服务器如果设置了timeout,客户端空转时间超过,将被关闭。例外的情况pub sub
客户端命令回复超过了输出缓冲区大小
硬性限制大小,超出即关闭
软性限制大小,超出,记录时间,时长达到设定的时长一直超出,被关闭
网友评论