数据库
首页 > 数据库> > Redis设计与实现 第 13 章 客户端

Redis设计与实现 第 13 章 客户端

作者:互联网

第 13 章 客户端

Redis 服务器是典型的一对多服务器程序,通过使用由 I/O 多路复用技术实现的文件事件处理器,服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信

redis.h/redisClient 结构保存了客户端当前的状态信息,以及执行相关功能需要用到的数据结构:

服务器状态结构的 clients 属性是一个链表,保存了所有与服务器相连接的客户端的状态结构

clients

clients链表

13.1 客户端属性

分为两类:

13.1.1 套接字描述符

客户端状态 fd 属性记录套接字描述符,取值为 -1 或大于 -1 的整数

13.1.2 名字

默认情况下客户端是没有名字的,名字记录在客户端状态的 name 属性,可以使用 clint setname 为当前客户端设置名字

没有名字时 name 属性指向 NULL 指针;设置了名字将指向一个字符串对象

13.1.3 标志

flags属性例子

13.1.4 输入缓冲区

sds querybuf 属性即客户端状态的输入缓冲区,保存客户端发送的命令请求,大小会根据输入内容动态变化,但最大不能超过 1 GB,否则服务器会关闭次客户端

querybuf

13.1.5 命令与命令参数

服务器对命令请求的内容分析后得出的命令参数及个数将被保存到客户端状态的 argv、argc 属性

argv、argc例子

13.1.6 命令的实现函数

服务器根据 argv[0] 的值在命令表中查找命令对应的命令实现函数

命令表

一个字典,键是 SDS 结构,保存名字,值是命令对应的 redisCommand 结构,保存了实现函数、命令标志等等的统计信息

程序在命令表中找到 argv[0] 所对应的 redisCommand 结构,则将 cmd 指针指向这个结构

查找命令并设置cmd属性

针对命令表的查找操作不区分输入字母的大小写

13.1.7 输出缓冲区

执行命令所得的回复保存在客户端状态的输出缓冲区,每个客户端都有两个输出缓冲区可用,一个固定一个变化

固定大小缓冲区由 buf、bufpos 组成

REDIS_REPLY_CHUNK_BYTES 默认为 16 * 1024 ,即 16 KB

固定

当 buf 数组使用完或者回复太大而没办法放进 buf 数组时,服务器则使用可变大小缓冲区

可变缓冲区由 reply 链表和一个或多个字符串组成,通过链表来连接多个字符串对象

可变大小

13.1.8 身份验证

客户端状态的 authenticated 属性记录了客户端是否通过身份验证

如果服务器没有启用身份验证,即使 authenticated 为 0 也不会拒绝,由 requirepass 设置

13.1.9 时间

时间有关属性

13.2 客户端的创建与关闭

13.2.1 创建普通客户端

如果客户端是通过网络连接与服务器进行连接的普通客户端,则在客户端使用 connect 函数连接到服务器时,服务器会调用连接事件处理器为客户端创建客户端状态,并加入到服务器状态 clients 链表末尾

13.2.2 关闭普通客户端

关闭原因:

可变大小缓冲区理论上任意长,但为了避免回复过大,会时刻检查客户端的输出缓冲区大小,超过时执行限制

进行设置

设置

13.2.3 Luau 脚本的伪客户端

lua_client 关联负责执行 Lua 脚本中的 Redis 命令的伪客户端,直到服务器关闭此客户端才会被关闭

13.2.4 AOF 文件的伪客户端

在载入 AOF 文件创建,载入完成后关闭

标签:13,REDIS,Redis,命令,缓冲区,服务器,13.1,客户端
来源: https://www.cnblogs.com/zephxu/p/14950876.html