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]);
}
}
将解析结果保存起来。
至此,本函数执行完毕。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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]);
}
}
将解析结果保存起来。
至此,本函数执行完毕。
相关文章推荐
- Redis源码分析系列十四:processInputBuffer
- Redis源码分析系列十六:processCommand研究
- redis客户端Jedis源码分析系列——从缓存池中获取资源和销毁资源
- Redis源码分析系列六:initserver中
- jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
- Redis源码分析系列十二:readQueryFromClient
- redis客户端Jedis源码分析系列——连接池的创建过程
- Redis源码分析系列五:initServer上
- Redis源码分析系列二十:3 命令"ping"---pingCommand
- Redis源码分析系列二十四: 7 set---setCommand解析
- jQuery-1.9.1源码分析系列(十五) 动画处理
- jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween
- jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
- jQuery 1.9.1源码分析系列(十五)之动画处理
- Redis源码分析系列二十一: 4 select---selectCommand
- Redis源码分析(十五)——持久化AOF
- jQuery-1.9.1源码分析系列(十五) 动画处理
- jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween
- Jquery1.9.1源码分析系列(十五)动画处理之外篇
- [置顶] Spring Boot系列十二 通过redis实现Tomcat集群的Session同步及从源码分析其原理