magent实现memcached集群的一个问题
之前我们小组封装了一个memcached类库,里面有一个名为RemoveStartWith的方法可以根据起始字符串删除所有节点中负责键值规则的缓存项。它实现的原理就是通过stats命令获取每个节点的所有缓存键值然后逐一匹配。使用magent后这个方法就不起作用了,因为magent并不支持stats命令。查看了magent.c源代码:
} else if (ntokens >= 2 && (strcmp(tokens[COMMAND_TOKEN].value, "stats") == 0)) { /* END\r\n */ char tmp[128]; out_string(c, "memcached agent v" VERSION); for (i = 0; i < matrixcnt; i ++) { snprintf(tmp, 127, "matrix %d -> %s:%d, pool size %d", i+1, matrixs[i].ip, matrixs[i].port, matrixs[i].used); out_string(c, tmp); } out_string(c, "END"); skip = 1; }
要让magent支持stats命令需要作出一定的修改,主要包括在conn结构中的flag结构新增一个stats相关命令、修改发送请求的do_transcation函数实现、修改处理请求的process_get_response函数实现。