原创文章,转载请标明,谢谢。
上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command函数,探究memcached客户端的set命令,解读memcached是如何解析客户端文本命令,剖析memcached的内存管理,LRU算法是如何工作等等。
解析客户端文本命令
客户端向memcached server发出set操作,memcached server读取客户端的命令,客户端的连接状态由 conn_read > conn_parse_cmd 转换,这时候,memcached server开始解析命令。memcached server调用try_read_command函数解析命令,memcached接收两种格式的命令,一种是二进制格式,另一种是文本格式(本文只讲文本格式的命令)。
1 static int try_read_command(conn *c) { 2 3 // .......... 4 5 if (c->protocol == binary_prot) { 6 7 // 二进制格式 8 // .... 9 10 } else { 11 char *el, *cont; 12 13 // 没有接收到客户端的命令,返回进入conn_waiting状态,等待更多的客户端数据 14 if (c->rbytes == 0) 15 return 0; 16 17 el = memchr(c->rcurr, ' ', c->rbytes); 18 if (!el) { 19 if (c->rbytes > 1024) { 20 /* 21 * We didn't have a ' ' in the first k. This _has_ to be a 22 * large multiget, if not we should just nuke the connection. 23 */ 24 char *ptr = c->rcurr; 25 while (*ptr == ' ') { /* ignore leading whitespaces */ 26 ++ptr; 27 } 28 29 if (ptr - c->rcurr > 100 || 30 (strncmp(ptr, "get ", 4) && strncmp(ptr, "gets ", 5))) { 31 32 conn_set_state(c, conn_closing); 33 return 1; 34 } 35 } 36 37 return 0; 38 } 39 40 // 客户端报文以' '结尾 41 cont = el + 1; 42 if ((el - c->rcurr) > 1 && *(el - 1) == ' ') { 43 el--; 44 } 45 *el = '