第13章 客户端

Huan Lee Lv5

Redis服务器是典型的一对多服务器程序, Redis使用单进程单线程的方式来处理命令多客户端的请求.

13.1 客户端属性

客户端状态保存在结构体redisClient中, 包括:

  • 客户端的套接字描述符. 伪客户端(来自AOF文件或者Lua脚本)的fd为-1, 否则为正整数
  • 客户端的名字. 通过 Client setname 设置, 默认为空
  • 客户端的标志值(flag). 通过各种常量标识客户端的角色和状态
  • 指向客户端正在使用的数据库的指针,以及该数据库的号码。
  • 客户端当前要执行的命令、命令的参数、命令参数的个数,以及指向命令实现函数的指针。
  • 客户端的输人缓冲区和输出缓冲区。
  • 客户端的复制状态信息,以及进行复制所需的数据结构。
  • 客户端执行BRPOP、BLPOP等列表阻塞命令时使用的数据结构。
  • 客户端的事务状态,以及执行WATCH命令时用到的数据结构。
  • 客户端执行发布与订阅功能时用到的数据结构。
  • 客户端的身份验证标志。0标识未通过身份验证, 用AUTH命令通过身份验证后值为1
  • 客户端的创建时间,客户端和服务器最后一次通信的时间,以及客户端的输出缓冲区大小超出软性限制(soft limit)的时间。

命令与命令参数

客户端的请求保存到querybuf中后, 服务器将会分析请求内容, 得到argv和argc

Untitled

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

13.2 客户端的创建与关闭

创建客户端

客户端通过connect函数连接到服务器, 服务器则调用连接事件处理器, 为其创建相应的客户端状态, 并添加到clients列表的末尾.

Untitled

关闭客户端

客户端的关闭有多种原因:

  • 如果客户端进程退出或者被杀死,那么客户端与服务器之间的网络连接将被关闭,从而造成客户端被关闭。
  • 如果客户端向服务器发送了带有不符合协议格式的命令请求,那么这个客户端也会被服务器关闭。
  • 如果客户端成为了CLIENT KILL命令的目标,那么它也会被关闭。
  • 如果用户为服务器设置了timeout配置选项,那么当客户端的空转时间超过 timeout选项设置的值时,客户端将被关闭。不过timeout选项有一些例外情况:如果客户端是主服务器(打开了REDIS MASTER标志),从服务器(打开了 REDIS SLAVE标志),正在被BLPOP等命令阻塞(打开了REDIS BLOCKED标志),或者正在执行SUBSCRIBE、PSUBSCRIBE等订阅命令,那么即使客户端的空转时间超过了timeout选项的值,客户端也不会被服务器关闭。
  • 如果客户端发送的命令请求的大小超过了输入缓冲区的限制大小(默认为1GB),那么这个客户端会被服务器关闭。如果要发送给客户端的命令回复的大小超过了输出缓冲区的限制大小,那么这个客户端会被服务器关闭。

伪客户端

  • 服务器会创建负责执行Lua脚本中包含的Redis命令的伪客户端, 这个伪客户端在Redis服务器的整个生命周期都存在.
  • 载入AOF文件时, 会创建用于执行AOF文件的伪客户端, 载入完成后关闭.
  • Title: 第13章 客户端
  • Author: Huan Lee
  • Created at : 2023-08-27 16:41:00
  • Updated at : 2024-02-26 04:53:15
  • Link: https://www.mirthfullee.com/2023/08/27/notion-第13章 客户端-fe700913/
  • License: This work is licensed under CC BY-NC-SA 4.0.