暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

355.Redis 底层实现:redisClient

原创 Oracle 2023-06-08
113


每天一个开发小知识


本文为《Redis设计与实现》学习笔记


在 Redis 服务器上会保存所有建立连接的 Redis 客户端信息


    struct redisServer
    {
    // ...
        list * client;
        // ...
    };


    redisClient 的数据结构


      typedef struct redisClient
      {
      int fd;
      robj * name;
      int flag;
      sds querybuf;
      robj ** argv;
      int argc;
      struct redistCommand * cmd;
      char buf[REDIS_REPLY_CHUNK_BYTES];
      int bufpos;
      list * reply;
      int authenticated;
      time_t ctime;
      time_t lastinteraction;
          time_t obuf_soft_limit_reached_time;
      } redisClient;


      其中


      • fd:套接字描述符,-1 表示伪客户端(Lua脚本,AOF 文件等),其余为大于-1的整数,表示普通客户端

      • name:客户端的名字,默认为空

      • flag:二进制或形式表示的标志,记录客户端目前的状态

      • queryBuf:输入缓冲区,保存客户端发送的命令请求,最大 1G,如果超过,服务器会关闭该客户端连接

      • argv:命令参数,从 queryBuf 解析而来

      • argc:命令个数,从 queryBuf 解析而来

      • cmd:命令的实现函数

      • buf:固定大小的输出缓冲区,保存长度比较小的回复,比如OK,简短字符串,整数,错误信息,默认 16KB

      • bufpos:buf 的使用长度

      • reply:可变大小的输出缓冲区,用链表实现

      • authenticated:身份验证信息,0 表示验证未通过,1 表示验证通过

      • ctime:客户端的创建时间

      • lastinteraction:客户端和服务器最后一次交互时间

      • obuf_soft_limit_reached_time:输出缓冲区第一次到达软性限制的时间


      硬性限制和软性限制


      reply 虽然为可变大小的输出缓冲区


      但是也有最大长度的限制


      如果输出缓冲区大于硬性限制


      服务器会关闭当前客户端


      如果输出缓冲区大于软性限制,小于硬性限制


      服务器会判断一段时间内,该客户端的输出缓冲区是否一直大于软性限制


      如果是,则关闭客户端


      否则,不关闭,同时将 obuf_soft_limit_reached_time 置为 0


      每天一个开发小知识,今天你学废了吗?

      「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
      关注作者
      【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论