事件、服务器、客户端、多线程
Redis基于Reactor模式开发了一套高效的事件处理模型,通过IO多路复用程序监听来自客户端的大量连接
Redis服务器是一个事件驱动程序,分为文件事件和时间事件
1 文件事件
服务器对套接字的操作称为文件事件,当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,与操作相对应的文件事件就会产生,文件事件分派器会调用关联的事件处理器来处理事件
- 文件事件处理器使用IO多路复用监听多个套接字
- 当客户端向服务器发起连接时,将触发连接应答处理器执行,并创建套接字
- 当客户端向服务器发起命令请求时,将引发命令请求处理器执行
- 然后使用命令回复处理器将命令写入套接字传给客户端
2 时间事件
服务器执行特定定时操作称为时间事件
- 定时事件:让程序在指定事件之后执行一次
- 周期性事件:让程序每隔指定时间就执行一次
3 客户端
一个服务器可以与多个客户端建立网络连接,服务器使用单线程单进程的方式处理命令请求
服务器状态结构使用链表连接多个客户端状态,新添加的客户端状态会放置链表末尾
输入缓冲区记录了客户端发起的命令请求,缓冲区大小不超过1GB
客户端有固定大小和可变大小的输出缓冲区,固定大小缓冲区的最大大小为16KB,可变大小缓冲区最大大小不能超过服务器设置的硬性限制,如果大小超过了服务器设置的硬性限制,那么客户端会被关闭;如果客户端在一定时间内,一直超过服务器设置的软性限制,客户端也会被关闭
4 服务器
客户端向服务器发送命令过程
- 客户端向服务器发送命令请求
- 服务器接收并处理命令请求,产生命令回复
- 服务器将命令回复发送给客户端
- 客户端接收命令回复,并打印给用户
服务器的serverCron函数默认每隔100毫秒执行一次,主要工作包括
- 更新服务器状态信息
- 处理服务器接收信号
- 管理客户端资源和数据库状态
- 检查并执行持久化操作
服务器从启动到能够处理客户端的命令请求需要执行
- 初始化服务器状态
- 载入服务器配置
- 初始化服务器数据结构
- 还原数据库状态
- 执行事件循环
5 多线程
Redis6.0引入多线程主要是为了提高网络IO读写性能
// 配置文件
// 多线程配置,默认是禁用的
io-threads-do-reads yes|no
// 设置线程数
io-threads <num>