出于调试目的,我想计算内存缓存服务器中的密钥数量,所以我做了一些研究,最后使用了memdump
实用程序,它似乎附带了libmemcached。
在命令的描述中,它说:
memdump从被告知要获取的所有服务器中转储“密钥”列表。因为memcached不保证提供所有密钥,所以无法获得完整的“转储”。
另外在另一个网站(Memcached Cheat Sheet)上我读到了:
[...] memcache协议提供了一些命令来查看由slabs组织的数据(给定大小范围的数据类别)。但是有一些重大的限制:
每个slab类只能转储键(内容大小大致相同的键)
每个slab类只能转储一页(1MB数据)
- 醇>
这是一个非官方的功能,可能会随时删除。
[...]
那么You can only dump one page per slab class (1MB of data)
在实践中意味着什么?一兆字节的数据是什么?如果一个slab包含超过1 MB的数据(包括密钥?),那么剩余的数据将不会被提取,我可能会错过一些密钥?
作为一个例子,我有3个密钥A和500 KB的数据,B有另外600 KB的数据和C有300 KB的数据,它们都是相同的板。然后在转储密钥时,只有A和B将被转储数据(这可能也会被切断?)
答案 0 :(得分:0)
memdump
实用程序使用memcache协议未记录的命令stats cachedump
来获取slab id的密钥列表。您可以在memcached源代码items.c中查看stats cachedump <slabs_id> <limit>
实现:
char *item_cachedump(const unsigned int slabs_clsid, const unsigned int limit, unsigned int *bytes) {
unsigned int memlimit = 2 * 1024 * 1024; /* 2MB max response size */
while (it != NULL && (limit == 0 || shown < limit)) {
// ... key copying occurs here
if (bufcurr + len + 6 > memlimit) /* 6 is END\r\n\0 */
break;
// ...
}
因此,如果没有重新编译memcached就不可能为每个slab提供超过2 Mb的密钥。值不会复制到响应缓冲区,响应大小限制仅适用于键。