假定我们已经取到了很多数据,
现在在看代码之前,我们可以自己先想下如果是自己处理字符串会是怎样的过程。
一般情况下,自然是从流里不停的搜索出一个命令,然后执行,再搜素出下一个。
直到当前没有一个完整的命令就停止解析,剩余的数据还是放在之前的缓冲区里,
反正也会有长度指示器指示当前缓冲区的长度,所以到了这里就很简单了。
让我们看看作者的思路。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//自定义检查点: 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函数。
且听下回分解。