redis-客户端

客户端属性

客户端状态包含的属性能够分为两类:redis

一类是比较通用的属性, 这些属性不多与特定功能相关, 不管客户端执行的是什么工做, 它们都要用到这些属性。 另一类是和特定功能相关的属性, 好比操做数据库时须要用到的 db 属性和 dictid 属性, 执行事务时须要用到的 mstate 属性, 以及执行 WATCH 命令时须要用到的 watched_keys 属性, 等等。 本章将对客户端状态中比较通用的那部分属性进行介绍, 至于那些和特定功能相关的属性, 则会在相应的章节进行介绍数据库

typedef struct redisClient {

    // ...

    int fd;

    // ...

} redisClient;
复制代码

根据客户端类型的不一样, fd 属性的值能够是 -1 或者是大于 -1 的整数:数组

伪客户端(fake client)的 fd 属性的值为 -1 : 伪客户端处理的命令请求来源于 AOF 文件或者 Lua 脚本, 而不是网络, 因此这种客户端不须要套接字链接, 天然也不须要记录套接字描述符。 目前 Redis 服务器会在两个地方用到伪客户端, 一个用于载入 AOF 文件并还原数据库状态, 而另外一个则用于执行 Lua 脚本中包含的 Redis 命令。 普通客户端的 fd 属性的值为大于 -1 的整数: 普通客户端使用套接字来与服务器进行通信, 因此服务器会用 fd 属性来记录客户端套接字的描述符。 由于合法的套接字描述符不能是 -1 , 因此普通客户端的套接字描述符的值必然是大于 -1 的整数。 执行 CLIENT_LIST 命令能够列出目前全部链接到服务器的普通客户端, 命令输出中的 fd 域显示了服务器链接客户端所使用的套接字描述符:缓存

  • addr:地址及端口
  • fd:套接字描述符
  • name: 可使用client setname 设置某个连接的名称
  • age: 连接的时间,单位秒
  • idle:空闲时间,单位秒
  • flags:记录了客户端的角色(role)
# 客户端是一个主服务器
REDIS_MASTER

# 客户端正在被列表命令阻塞
REDIS_BLOCKED

# 客户端正在执行事务,但事务的安全性已被破坏
REDIS_MULTI | REDIS_DIRTY_CAS

# 客户端是一个从服务器,而且版本低于 Redis 2.8
REDIS_SLAVE | REDIS_PRE_PSYNC

# 这是专门用于执行 Lua 脚本包含的 Redis 命令的伪客户端
# 它强制服务器将当前执行的命令写入 AOF 文件,并复制给从服务器
REDIS_LUA_CLIENT | REDIS_FORCE_AOF | REDIS_FORCE_REPL
复制代码

输入缓冲区

typedef struct redisClient{
    sds querybuf;
}redisClient
复制代码
  • 输入缓存区的大小会根据输入内容动态的缩小或者扩大,但它的最大大小不能超过1GB,不然服务器将关闭这个客户端。

命令与参数

typedef struct redisClient{
    robj **argv;
    int argc;
}redisClient
复制代码
  • argv属性是一个数组,数组中的每一个项都是一个字符串对象,其中argv[0]是要执行的命令,而以后的其余项则传给命令的参数。
  • argc属性则负责记录argv数组的长度

命令的实现函数

举例命令:set key value 直接看图: 安全

输出缓冲区

执行客户端的回复会保存在客户端状态的输出缓冲区里面,每一个客户端都有两个输出缓冲区可用,一个缓存区是固定大小,另外一个缓冲区的大小是可变的bash

  • 固定大小的缓冲区用于保存那些长度比较小的回复,好比ok、简短的字符串值、整数值、错误回复等等。
  • 可变大小的缓冲区用于保存那些长度比较大的回复,好比一个很是长的字符串值,一个由不少项组成的列表,一个包含了不少元素的集合等等。
typedef struct redisClient{
    char buf[REDIS_REPLY_CHUNK_BYTES];
    
    int bufpos;
    
    list *reply;
}
复制代码
  • buf数组,REDIS_REPLY_CHUNK_BYTES默认值16*1024,大小为16KB
  • bufpos记录buf数组使用字节的数量
  • reply是一个链表

固定缓冲区 服务器

可变缓冲区

身份验证

  • authenticated:0未验证,1已验证经过
  • requirepass:配置此属性是的打开验证

客户端的建立与关闭

何时客服端关闭

  • 客户端退出或者被杀死
  • 客户端发送不符合协议格式的命令,被服务端关闭
  • 被 client kill
  • 服务器设置了timeout
  • 输入缓冲区大于限制大小,默认1GB
  • 回复的命令大于输入缓冲区的限制

配置网络

  • clinet-output-buffer-limit normal 0 0 0 :表示不限制客户端的输出缓冲区大小
  • clinet-output-buffer-limit slave 256mb 64mb 60 :硬性设置256MB,软性设置为64MB,软性限制的时长60秒
  • clinet-output-buffer-limit pubsub 32mb 8mb 60 :发布与订阅硬性限制32MB,软性限制8MB,软性相纸的时长为60秒

伪客户端

  • lua脚本
  • AOF文件:服务器载入AOF文件时

重点

  • 服务器状态结构使用 clients 链表链接起多个客户端状态, 新添加的客户端状态会被放到链表的末尾。
  • 客户端状态的 flags 属性使用不一样标志来表示客户端的角色, 以及客户端当前所处的状态。
  • 输入缓冲区记录了客户端发送的命令请求, 这个缓冲区的大小不能超过 1 GB 。 命令的参数和参数个数会被记录在客户端状态的 argv 和 argc 属性里面, 而 cmd 属性则记录了客户端要执行命令的实现函数。
  • 客户端有固定大小缓冲区和可变大小缓冲区两种缓冲区可用, 其中固定大小缓冲区的最大大小为 16 KB , 而可变大小缓冲区的最大大小不能超过服务器设置的硬性限制值。
  • 输出缓冲区限制值有两种, 若是输出缓冲区的大小超过了服务器设置的硬性限制, 那么客户端会被当即关闭; 除此以外, 若是客户端在必定时间内, 一直超过服务器设置的软性限制, 那么客户端也会被关闭。
  • 当一个客户端经过网络链接连上服务器时, 服务器会为这个客户端建立相应的客户端状态。 网络链接关闭、 发送了不合协议格式的命令请求、 成为 CLIENT_KILL 命令的目标、 空转时间超时、 * * 输出缓冲区的大小超出限制, 以上这些缘由都会形成客户端被关闭。 处理 Lua 脚本的伪客户端在服务器初始化时建立, 这个客户端会一直存在, 直到服务器关闭。
  • 载入 AOF 文件时使用的伪客户端在载入工做开始时动态建立, 载入工做完毕以后关闭。
相关文章
相关标签/搜索