文章目录
  1. 1. 单机数据库实现——客户端
    1. 1.1. 客户端属性,套接字描述符
    2. 1.2. 客户端创建与关闭

单机数据库实现——客户端

服务器客户端

Redis服务器使用clients链表来存储客户端状态结构。

客户端属性,套接字描述符

redisClient的fd属性记录了客户端正在使用的客户端套接字描述符。

  • fd=-1,伪客户端,命令请求来源于AOF文件或者lua脚本。
  • fd大于-1,普通客户端。

redisClient的lastinteraction可以用来计算客户端的空转时间,使用client list进行查看
clientlist

客户端创建与关闭

  • 普通客户端创建,会在连接服务器时,服务端通过连接事件处理器,为客户端创建客户端状态,并将客户端添加到clients链表结尾。
  • 普通客户端的关闭
    • 客户端进程关闭或被杀死
    • 客户端向服务器发送带有不符合协议格式的命令请求
    • 客户端成为client kill的目标
    • 服务器设置timeout配置选项,客户端空转时间超出timeout时会被关闭。例外情况:客户端是主服务器(打开了REDIS_MASTER标志),从服务器(打开了redis_slave标志),正在被blpop等命令阻塞(打开了REDIS_BLOCKED标志),或在执行subscriber、psubscriber等订阅命令,那么即使客户端的空转时间超出timeout值,客户端也不会被服务器关闭
    • 客户端发送命令大小超出了输入缓冲区的限制大小(默认1gb)
    • 发送给客户端的回复超出了输出缓冲区的大小,具体如下:
  • 服务器输出缓冲区限制模式 ,硬性限制、软性限制
    • 硬性限制:超出硬性设置大小,立即关闭。
    • 软性限制:超出软性设置大小,但没超出硬性设置大小,obuf_soft_limit_reached_time属性纪录客户端到达软性限制的起始时间,之后服务器监视客户端,如果持续超出限制,并达到软性限制超出时间,客户端会被关闭。如果未达到超出时间则不会关闭,obuf_soft_limit_reached_time会被清0。
      client_output_buffer_limit配置项可以对相关参数进行配置。
      config
文章目录
  1. 1. 单机数据库实现——客户端
    1. 1.1. 客户端属性,套接字描述符
    2. 1.2. 客户端创建与关闭