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

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

hot3.png

假定我们已经取到了很多数据,

现在在看代码之前,我们可以自己先想下如果是自己处理字符串会是怎样的过程。

一般情况下,自然是从流里不停的搜索出一个命令,然后执行,再搜素出下一个。

直到当前没有一个完整的命令就停止解析,剩余的数据还是放在之前的缓冲区里,

反正也会有长度指示器指示当前缓冲区的长度,所以到了这里就很简单了。

让我们看看作者的思路。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 //自定义检查点: 1 2 3

 
    /* Keep processing while there is something in the input buffer */
    while(sdslen(c->querybuf))
 {
  //当缓冲区里还有数据
  //自定义检查点: 1 2 3

  
 
        /* Immediately abort if the client is in the middle of something. */
        if (c->flags & REDIS_BLOCKED)
   return;
  //如果当前的状态是blocked,则立即返回
  //自定义检查点: 1 2 3

 

  

        /* REDIS_CLOSE_AFTER_REPLY closes the connection once the reply is

         * written to the client. Make sure to not let the reply grow after
         * this flag has been set (i.e. don't process more commands). */
        if (c->flags & REDIS_CLOSE_AFTER_REPLY) return;
  //自定义检查点: 1 2 3

  

  

        /* Determine request type when unknown. */

  //根据第一个字符判断交互方式
        if (!c->reqtype)
  {
   //如果还没有确定出请求类型
   //自定义检查点: 1 2 3
            if (c->querybuf[0] == '*')
   {
                c->reqtype = REDIS_REQ_MULTIBULK;
            }
   else
   {
                c->reqtype = REDIS_REQ_INLINE;
            }
        }
  //自定义检查点: 1 2 3

  

        if (c->reqtype == REDIS_REQ_INLINE)
  {
            if (processInlineBuffer(c) != REDIS_OK) break;
   
        }
  else if (c->reqtype == REDIS_REQ_MULTIBULK)
  {
            if (processMultibulkBuffer(c) != REDIS_OK) break;
        }
  else
  {
            redisPanic("Unknown request type");
        }

如果是REDIS_REQ_INLINE交互方式,则执行 processInlineBuffer。

我们假定交互方式是REDIS_REQ_INLINE,所以我们会去执行processInlineBuffer函数。

且听下回分解。

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

你可能感兴趣的文章
为什么要在下班后努力学习?你不知道的秘密...... ...
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
Spring Cloud 2.x系列之整合rocketMQ
查看>>
答疑解惑:Linux与Windows的那些事儿(2)
查看>>
Java的Socket网络编程以及多线程
查看>>
百万连接之路
查看>>
关于传输自环导致中兴2826交换机无法网管的故障案例
查看>>
Fsutil文件的具体用法
查看>>
linux 笔记本的温度提示
查看>>
【转载】nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决
查看>>
项目管理实践教程
查看>>
(转)DOTA新版地图6.78发布:大幅改动 增两位新英雄
查看>>
合成模式
查看>>
Primefaces框架开发杂谈!
查看>>
《scp 备份站点 笔记》连带邮件提醒
查看>>
Solaris 10u11 安装python2.7.10
查看>>
常用端口号大全(详细)
查看>>
我的友情链接
查看>>
工欲善其事必先利其器SecureCRT+VMware® Workstation_学习笔记
查看>>
文件和目录权限chmod,更改所有者和所属组chown,umask,隐藏权限lsattr/chattr
查看>>