博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis源码分析系列十二:readQueryFromClient
阅读量:6226 次
发布时间:2019-06-21

本文共 1559 字,大约阅读时间需要 5 分钟。

hot3.png

下面我们紧接着研究客户与服务器交互的readQueryFromClient函数。

    redisClient *c = (redisClient*) privdata;

 //指向之前设置的对象指针
 
    int nread;
 int readlen;
 //REDIS_IOBUF_LEN
 
 
    size_t qblen;
 //指示之前已经读的数据
 
 //设置几个变量
 

 

    REDIS_NOTUSED(el); 
    REDIS_NOTUSED(mask);
 //没有任何意义

    server.current_client = c;

 //存储当前的对象
 
 
    readlen = REDIS_IOBUF_LEN;

//每次想读的数据长度

 
    /* If this is a multi bulk request, and we are processing a bulk reply
     * that is large enough, try to maximize the probability that the query
     * buffer contains exactly the SDS string representing the object, even
     * at the risk of requiring more read(2) calls. This way the function
     * processMultiBulkBuffer() can avoid copying buffers to create the
     * Redis Object representing the argument. */
     //自定义检查点: 1 2 3
     //自定义检查点: 1 2 3
     //自定义检查点: 1 2 3

 

    
    if (c->reqtype == REDIS_REQ_MULTIBULK
  && c->multibulklen
  && c->bulklen != -1
        && c->bulklen >= REDIS_MBULK_BIG_ARG
        )
    {
        int remaining = (unsigned)(c->bulklen+2)-sdslen(c->querybuf);

        if (remaining < readlen) readlen = remaining;

    }
 //不需要执行
 

    qblen = sdslen(c->querybuf);

//之前缓冲区里已经存在的数据的长度

 
 
    if (c->querybuf_peak < qblen)
  c->querybuf_peak = qblen;
 //不需要执行
 //自定义检查点: 1 2 3
 
 
 
    c->querybuf = sdsMakeRoomFor(c->querybuf, readlen);

//保证有足够的空间

 
 
    nread = read(fd, c->querybuf+qblen, readlen);
//开始读取数据

 if (nread == -1)

 {
        if (errno == EAGAIN)
  {
            nread = 0;
        }
  else
  {
            redisLog(REDIS_VERBOSE, "Reading from client: %s",strerror(errno));
            freeClient(c);
            return;
        }
    }
 else if (nread == 0)
 {
        redisLog(REDIS_VERBOSE, "Client closed connection");
        freeClient(c);
        return;
    }

//对读取操作的返回状态进行判断。

困了,睡觉!!!

转载于:https://my.oschina.net/qiangzigege/blog/170918

你可能感兴趣的文章
多线程的那点儿事(基础篇)
查看>>
win10安装MarkdownPad 2报错This view has crashed的处理及md简单语法
查看>>
RESTful API测试工具
查看>>
Python 安装cx_Oracle模块折腾笔记
查看>>
wvs_patcher批量测试网站
查看>>
【转】Lua编程规范
查看>>
P4779 【模板】单源最短路径(标准版)
查看>>
二三维联动之MapControl与SceneControl的联动
查看>>
cocos2dx ScrollView 测试二 自定义Item和boundingBox
查看>>
洛谷P4175 网络管理
查看>>
js监听input输入字符变化
查看>>
tcpdump详解
查看>>
JAVA基础:ArrayList和LinkedList区别
查看>>
不仅仅完成功能,避免无效成本浪费
查看>>
[转载]SCSF 系列:Smart Client Software Factory 中 MVP 模式最佳实践
查看>>
什么是零宽断言
查看>>
复制延迟排查
查看>>
5.01 列出模式中的表
查看>>
Algs4-1.4DoublingRatio
查看>>
html介绍和head标签
查看>>