Redis设计与实现——Redis客户端

客户端

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链表末尾。

关闭:

  1. 客户端进程退出或者被杀死,客户端与服务器之间的网络连接被关闭,从而造成客户端被关闭;
  2. 客户端向服务器发送的命令包含了错误的协议格式;
  3. 客户端成为CLIENT KILL命令的目标;
  4. 如果用户设置了timeout配置选项,则客户端空转时间超过了timeout值时,会被关闭(例外情况:客户端是主服务器、从服务器、正在被BLPOP等命令阻塞、或者正在执行SUBSCIRBE/PSUBSCRIBE等订阅命令);
  5. 客户端发送的请求命令大于输入缓存区限制的大小;
  6. 发送给客户端的回复命令大小超过了缓冲区限制的大小;

服务器限制客户端缓冲区模式:

模式说明
硬性限制如果输出缓冲区的大小超过了硬性限制所设置的大小,服务器会立即关闭客户端
软性限制如果输出缓冲区的大小超过了软件限制的大小,但没有超过硬性限制的大小,那么客户端会在obuf_soft_limit_reached_time中记录客户端到达软性限制的起始时间,继续监视客户端,如果输出缓冲区一直超出软性限制且时间超过了服务器所设置的时长,则服务器将关闭客户端,否则obuf_soft_limit_reached_time会被清零,客户端不会被关闭

伪客户端

  1. lua脚本的伪客户端: 在服务器运行的整个生命期中会一直存在,知道服务器被关闭;
  2. AOF文件的伪客户端:在载入工作开始时动态创建,载入完毕后关闭。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值