美文网首页
Redis客户端

Redis客户端

作者: Robin92 | 来源:发表于2021-07-28 23:17 被阅读0次

    《Redis 设计与实现》
    《Redis 设计与实现》图片集

    Redis 使用单线程+I/O多路复用技术实现文件事件处理器,并与多个客户端进行网络通信。对于每个和服务器连接的客户端,服务器都为它创建了相应的客户端状态(redisClient结构)。

    typedef redisServer {
      list *clients; // 一个链表,保存了所有客户端状态
      // ...
    }
    
    用链表存储客户端状态

    客户端属性

    这里只介绍一个通用的属性,另一类是特定功能的属性如执行 WATCH 命令用到的 watched_keys 等等。

    typedef struct redisClient {
      // ...
      int fd; // 套接字文件描述符(伪客户端用 -1,其他为大于 -1 的整数)
      robj *name; // 客户端可用 CLIENT SETNAME 命令设置
      int flags; // 用于记录客户端的角色和状态,如 REDIS_MASTER|REDIS_PRE_PSYNC 等等
      sds querybuf; // 输入缓冲区,请求过来后先存放存在这里,<= 1G
    
      robj **argv; // 一个数组存放命令参数列表
      int argc; // 参数个数(argv的长度)
      struct redisCommand *cmd; // 指向实现请求命令(argv[0])的函数
    
      char buf[REDIS_REPLY_CHUNK_BYTES]; // 输出缓冲区1(固定大小 16K)
      int bufpos; // 固定大小输出缓冲区 1 中有效内容的长度
      list *reply; // 输出缓冲区2(可变大小),用链表实现
      
      int authenticated; // 是否通过了身份验证(0/1),服务器关闭验证时无效
      time_t ctime; // 创建客户端的时间 created time
      time_t lastinteraction; // 最后互动的时间
      time_t obuf_soft_limit_reached_time; // 输出缓冲区第一次到达软性限制的时间
    }
    

    客户端的种类

    客户端细分有三种:

    • 普通客户端:使用网络进行通信的客户端
    • Lua 脚本的伪客户端:lua 客户端与服务器的生命周期一致
    • AOF 文件的伪客户端:仅在载入 AOF 时存在

    关闭客户端的场景

    • 客户端进程退出
    • 客户端发送了不符合协议的命令请求(被服务器关闭)
    • 客户端成为了 CLIENT KILL 的目标
    • 服务器配置了 timeout 属性,客户端空转时间超时
    • 客户端请求超过输入缓冲区 1G 大小
    • 返回客户端的输出超过了输出缓冲区的限制大小

    其中最后一条,输出缓冲区虽然用了链表来存,但对其限制还有一定的规则。两种规则:

    • 硬性限制:超出则立即关闭客户端;
    • 软性限制:持续超出软限一定时间后关闭客户端。

    相关文章

      网友评论

          本文标题:Redis客户端

          本文链接:https://www.haomeiwen.com/subject/tzenmltx.html