一:服务器中的数据库
1.1: 数据结构
redisserver:
image.png
redisdb
image.png
1.2 图示
image.png image.png
1.3 特性
redis服务器所有的数据库都保存在数据库结构redisserver.db中,可使用use dbnum 切换
image.png
数据库主要由dict和expires两个字典组成,其中dict用于保存键值对,expires用于保存键的过期时间。
可为数据库键设置生存时间或过期时间,键的redis过期键删除策略采用:惰性删除和定期删除两种策略。
客户端通过订阅,可以获知数据库中键的变化,以及数据库中命令的执行情况。
二:rdb持久化
数据库状态:服务器中非空数据库以及它们的键值对统称为数据库状态。
rdb持久化将内存中的redis状态,记录到rdb文件中,保存在磁盘上。
相关命令:save、bgsave
由于aof文件的更新频率通常比rdb文件的更新频率高,所以aof文件优先被加载。
image.png
服务器在载入rdb文件期间,会一直处于阻塞状态,知道载入工作完成为止。
三:aof持久化
aof保存写命令来记录数据库状态。
image.png
image.png
载入:
image.png
四:事件
redis服务器通过套接字与客户端进行连接。
redis服务器是一个事件驱动程序,服务器处理的事件分为时间事件和文件事件两类。
文件事件处理器是基于reactor模式模式实现的网络通信程序
文件事件是对套接字对抽象:每次套接字变为可应答,可写,或可读时,相应的文件事件就会产生。
文件事件分为ae_readable ae_writable两类
时间事件分为定时事件和周期性事件两类
服务器在一般情况下只执行servercron函数一个时间事件,并且这个事件是周期性事件
文件事件和时间事件之间是合作关系,服务器会轮流处理这两种事件,并且处理事件的过程中也不会进行抢占。
时间事件的实际处理时间通常会比设定的到达时间晚一点。
五:客户端
5.1 数据结构
redisserver
image.png
image.png
redisclient数据结构
struct client {
int fd;
sds querybuf;
int argc;
robj **argv;
redisDb *db;
int flags;
list *reply;
char buf[PROTO_REPLY_CHUNK_BYTES];
... many other fields ...
}
5.2 字段解释
redisserver:
clients: 客户端信息列表
client::
fd:客户端正在使用的套接字描述符
flags:客户端的角色,以及客户端所处的状态
querybuf: 输入缓冲区,保存客户端发送的命令请求
argv: 字符串数组,argv[0]存储要执行的命令,之后是参数
argc: argv数组的长度
cmd: 指针,指向rediscommand结构
buf,bufpos: 输出缓冲区,固定大小。buf是一个字节数组,bufpos属性记录目前已经使用的字节数量。
reply: 输出缓冲区、可变大小。
quthenticated: 记录客户端是否通过了身份验证
ctime:创建客户端的时间
lastinteraction:客户端与服务器最后一次进行互动的时间
cbuf_soft_limit-reached_time:客户端的空转时间
5.3 图示
image.png
image.png
image.png
image.png
六:服务器
1: 命令请求的执行过程(set key value)
1.1客户端向服务器发送命令请求 "set key value"
1.2服务器接受并处理客户端发来的请求“set key value”,在数据库中进行设置操作,并产生命令返回ok
1.3 服务器将命令回复ok发送给客户端
1.4 客户端接受服务器返回的命令回复ok,并将这个回复打印给用户观看。
2: 各步骤细节
2.1 发送命令请求
客户端将命令转化成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。
image.png
2.2 读取命令请求
读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面。
对输入缓冲区的命令请求进行分析,提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv,argc。
调用命令执行器,执行客户端指定的命令。
image.png
2.3 查找命令实现
命令表是一个字典:
字典的key是命令的名字,如set,get,del
字典的值是一个个rediscommand结构,每个rediscommand结构记录了一个redis命令的实现信息。
image.png
image.png
image.png
将client的cmd属性指向rediscommand结构。
2.4 执行预备操作
检查参数是否合法,是否通过了身份验证等
2.5 client->cmd->proc(client)
image.png
2.6 执行后续工作
2.7 将命令回复发送给客户端。
3: servercron函数: 每100毫秒执行一次,他的工作主要包括更新服务器状态信息,处理服务器接受的sigterm信号,管理客户端资源和数据库状态,检查并执行持久化操作等等。
4:服务器从启动到能够处理客户端的命令请求需要执行以下步骤:
初始化服务器状态
载入服务器配置
初始化服务器数据结构
还原数据库状态
执行事件循环
参考: 《redis设计与实现》
网友评论