1

最近在看redis源码,现在正在研究网络代码。

Redis 使用非阻塞模式和 epoll(或类似的东西)进行网络数据读/写。当读取数据事件到达时,会调用“readQueryFromClient”函数,并在该函数中将请求数据读入缓冲区。

在“readQueryFromClient”函数中,如果确实有数据到达,则通过一个“read”函数将数据读入缓冲区,然后处理请求。

 nread = read(fd, c->querybuf+qblen, readlen); // **one read function**
//... some other codes to check read function retuen value
processInputBuffer(c);// **request will be handled in this function**

我的问题是:redis 如何确保所有请求数据都可以通过一个“读取”函数调用读入缓冲区,也许所有数据都将通过更多“读取”函数调用获取?

4

1 回答 1

2

processInputBuffer(c);//请求将在此函数中处理

那部分是不正确的。Redis 协议旨在包括传递的每个数据块的长度。所以服务器总是知道它需要读取多少数据才能发出完整的请求。在内部processInputBuffer,如果既不processInlineBuffer也不processMultibulkBuffer返回REDIS_OK(即在缓冲区中找不到请求终止符/没有足够的参数),控制权就从函数中消失了。在这种processInputBuffer情况下所做的只是填满客户端缓冲区的一块并更新解析状态。然后,在事件循环的下一次迭代中,在对 的调用中aeProcessEvents,如果套接字缓冲区中还有未读数据,readQueryFromClient将再次触发回调以解析剩余数据。

于 2013-08-13T11:37:59.003 回答