Redis-客户端和服务器

事件

  1. 文件事件:Redis服务器通过套接字与客户端进行连接,文件事件就是服务器对套接字的抽象操作。

  2. 文件事件处理器:使用I/O多路复用程序同时监听多个套接字,并根据套接字执行的任务关联不同的事件处理器。以单线程的方式运行,即实现了高性能的网络通信模型,也很好的与Redis服务器中其他单线程运行的模块进行对接,保持Redis内部单线程设计的简单性。

  3. 文件事件处理器的构成:套接字、I/O多路复用程序、文件事件分派器、事件处理器。

    套接字负责准备好执行通信的操作。
    I/O多路复用程序负责监听多个套接字,并向文件事件分派器传送套接字,它将产生事件的套接字放到一个队列中,有序同步地向文件事件分派器传送套接字。
    文件事件分派器接受套接字并产生事件的类型,调用事件处理器。事件处理器用来处理不同的套接字操作。

  4. 文件事件处理器
    Redis-客户端和服务器_第1张图片

  5. 时间事件:一些操作需要在给定的时间点执行,时间事件就是服务器对定时操作的抽象。

  6. 时间事件分为定时事件(指定时间之后执行一次)周期时间(每隔一段时间执行一次)

  7. 时间事件的实现:服务器将所有时间事件都放在一个无序链表中, 每当时间事件执行器运行时,它就遍历整个链表,查找所有已到达的时间事件,并调用相应的事件处理器。

  8. 文件事件和时间事件之间是合作关系,服务器会轮流处理这两种事件,并且处理事件的过程中也不会进行抢占。时间事件的实际处理时间通常会比设定的到达时间晚一些。

客户端

Redis是一个一对多服务器程序,每个客户端的建立,都会在服务器的clients链表中插入客户端状态。
Redis-客户端和服务器_第2张图片

  1. 客户端的标志属性flag
    记录了客户端的角色,比如主从复制时,主服务器会成为从服务器的客户端,从服务器也会成为主服务器的客户端,REDIS_MASTER表示客户端是主服务器,REDIS_SLAVER表示客户端是从服务器。

  2. 输入缓冲区:用于保存客户端发送的命令请求,大小会根据输入内容动态的收缩或扩大,但最大不能超过1GB,否则服务器会关闭这个客户端。

  3. 输出缓冲区:执行命令得到的命令回复会被保存在客户端状态的输出缓冲区中,每个客户端都有一个固定大小和一个可变大小的缓冲区。固定大小的缓冲区用于保存长度比较小的回复,最大为16KB,而可变缓冲区保存长度比较大的回复。

  4. 关闭普通客户端的原因

    • 客户端进程被退出或者杀死,客户端与服务器间的网络连接断开
    • 客户端向服务器发送了不符合协议格式的命令请求
    • 客户端发送的命令请求大小超过了输入缓冲区的大小——1GB
    • 客户端的命令回复大小超过了输出缓冲区的限制大小
  5. 服务器限制客户端的两种模式
    客户端的回复过大会占用过多服务器资源,服务器会时刻检查客户端的输出缓冲区大小,如果超出范围会执行相应的限制操作。

    1. 硬性限制:如果超出了硬性限制的大小,那么服务器立刻关闭客户端。
    2. 软性限制:如果输出缓冲区的大小超过了软性限制的大小没超过硬性限制的大小,那么服务器会记录下客户端达到软性限制的起始时间,如果后续一直超出软性限制且持续时间超过服务器的设置,就关闭客户端。

服务器

服务器负责与多个客户端进行网络连接,处理客户端发送的命令请求,在数据库保存客户端执行产生的数据,通过管理资源来维持自身的运转。

命令的执行过程

  1. 发送命令请求。用户输入一个命令请求,客户端对这个命令进行转换成协议格式,通过套接字发送给服务器。
  2. 服务器读取命令请求。通过命令请求处理器,读取协议格式的命令请求,并保存在客户端状态的输入缓冲区。对命令请求进行分析,提取出命令参数等,调用命令执行器执行命令。
  3. 命令处理器根据命令参数去命令表查找指定命令并保存到客户端状态中
  4. 执行一些预备操作,来保证命令可以被正确、顺利的执行。比如:是否是错误的命令,客户端是否通过身份认证,是否正在载入数据等。
  5. 执行指定的操作,产生相应的命令回复,并保存到客户端状态的输出缓冲区中,并为客户端的套接字关联命令回复处理器,负责将命令回复返回给客户端。
  6. 执行后续操作。比如开启了AOF功能,就写入到AOF缓冲区。

服务器从启动到能处理命令的过程

  1. 初始化服务器:设置服务器运行需要的配置。
  2. 载入配置选项:载入redis.conf配置文件中的设置,如端口号,是否开启AOF等
  3. 初始化服务器数据结构:为服务器创建需要的数据结构,比如clients链表,Server.db数组。服务器必须先载入用户指定的配置选项才能进行初始化。
  4. 还原数据库状态:载入RDB文件或者AOF文件,根据文件记录的内容来还原数据库状态。
  5. 接受客户端的连接请求并处理命令请求

你可能感兴趣的:(Redis,redis)