Memcached:检索所有键时如何打破限制

Memcached: How to break the limitation when retrieving all keys

由于我无法在网络中找到任何可靠的程序,一旦 slab 中的键数 > 500k 就会检索所有内存缓存键,我想在 PHP 中编写自己的程序。

然后我意识到所有的程序都不能真正适用于如此多的键是有原因的。

当我用 stats cachedump <slab-id> <limit> 读取密钥时,它 returns 只有一定数量的密钥结束 - 在我的情况下 - 大约 30k。

我怎样才能至少得到这 500k 可能在一个 slab 中?

所有建议使用memdump的"posts"和"answers"都不行。他们也有这个限制。

我正在使用memcached 1.4.25

调试 memcached 源代码后,我意识到限制在 items.c/ item_cachedump() 中,由这一行引起:

unsigned int memlimit = 2 * 1024 * 1024;   /* 2MB max response size */

由于此分配,分配的缓冲区限制了返回键的数量,因为所有键的总长度[包括每个键名后的 \r\n] 不得 超过这个尺寸。

我可以通过将其更改为以下方式来解决我的问题:

unsigned int memlimit = 128 * 1024 * 1024;

并重新编译 memcached。现在我可以读取大约 700k 个键[我没有更多的键来最大化功能]。

我发现一个非常高的值会使系统不稳定。值为 500 * 1024 * 1024 [e.q。 500MB] 我的系统差点因为这条信息崩溃:

shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory

即使我的服务器有 5GB RAM 我也不太明白为什么,但最终 128MB 的值是一个可用值。

我要求 memcached developer team 添加一个可以在命令行中设置值的开关。