您的位置:首页 > 数据库 > Redis

Redis源码分析系列十五:processInlineBuffer

2013-10-24 00:00 197 查看
现在我们开始分析具体的处理函数processInlineBuffer。

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

char *newline = strstr(c->querybuf,"\r\n");

//查找第一个\r\n的位置

int argc;
int j;
//设置两个整型变量

sds *argv;

sds aux;
////将querylen长度的字符串重新初始化成一个sds数据结构体
size_t querylen;
//当前查找\r\n后的长度

//设置若干变量

/* Nothing to do without a \r\n */
if (newline == NULL)
{
if (sdslen(c->querybuf) > REDIS_INLINE_MAX_SIZE) {
addReplyError(c,"Protocol error: too big inline request");
setProtocolError(c,0);
}
return REDIS_ERR;
}
//如果没有找到\r\n,则返回

/* Split the input buffer up to the \r\n */
querylen = newline-(c->querybuf);
//设置为查询到的长度

aux = sdsnewlen(c->querybuf,querylen);
//将querylen长度的字符串重新初始化成一个sds数据结构体

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

然后后面的函数是:sdssplitargs

从字面来理解的话,应该是以某个字符串为分割,结果是返回一个数组。

我们跟进去一窥奥义。

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

我稍微看了下这个函数的代码,没有百分百弄清楚,

我看了下

/* add the token to the vector */
vector = zrealloc(vector,((*argc)+1)*sizeof(char*));

vector[*argc] = current;

(*argc)++;
然后知道这个函数的作用是:将这个字符串解析下,分割成若干个字符串数组

vector的每个成员是一个字符串首地址,argc返回字符串的个数,然后就返回了,

现在的问题是,如何解析字符串,返回的是什么样的形式呢?

下面是我的理解:

1:在双引号中,

1.1 \xab十六进制形式的,转换成一个数字。

1.2 "\n"--->'\n'

1.3 "\r"--->'\r"
1.4"\t"--->'\t'

1.5 "\b"--->'\b'

1.6 "\a"--->'\a'

1.7其它字符,复制进去。

2:在单引号中

2.1 "\'"--->'\''

2.2 其它字符,复制进去。

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

然后我们回到processInlineBuffer函数。

下面的代码,我们来关注sdsrange(c->querybuf,querylen+2,-1);

由于之前我们已经处理了一部分字符串,现在要把这个字符串从缓冲区里撤走。

/* Setup argv array on client structure */
if (c->argv) zfree(c->argv);
c->argv = zmalloc(sizeof(robj*)*argc);
//释放已经有的缓冲区,然后根据解析结果来重新分配缓冲区。

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

/* Create redis objects for all arguments. */
for (c->argc = 0, j = 0; j < argc; j++)
{

if (sdslen(argv[j]))
{

c->argv[c->argc] = createObject(REDIS_STRING,argv[j]);

c->argc++;

}
else
{

sdsfree(argv[j]);

}
}

将解析结果保存起来。

至此,本函数执行完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息