Memcached:如何在检索所有密钥时打破限制

Al *_*ndy 5 php memcached

由于我无法在网络中找到任何可靠的程序,一旦板块中的密钥数量超过500k就会检索所有的memcache密钥,我想用PHP编写自己的程序.

然后我意识到有一个原因,为什么所有的程序都没有真正适用于这么多的密钥.

当我用stats cachedump <slab-id> <limit>它读取键时,只返回一定数量的键 - 在我的情况下 - 结束约30k.

我怎样才能得到至少这500k可能在一块板上?

建议使用的所有"帖子"和"答案" memdump都不起作用.他们也有这个限制.

我在用 memcached 1.4.25

Al *_*ndy 4

调试源代码后,memcached我意识到限制是由这一行引起的items.citem_cachedump()

unsigned int memlimit = 2 * 1024 * 1024;   /* 2MB max response size */
Run Code Online (Sandbox Code Playgroud)

由于此分配,分配的缓冲区限制了返回键的数量,因为所有键的总长度(包括\r\n每个键名称之后)不得超过此大小。

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

unsigned int memlimit = 128 * 1024 * 1024;
Run Code Online (Sandbox Code Playgroud)

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

我发现非常高的值会使系统不稳定。当值为500 * 1024 * 1024[eq 500MB] 时,我的系统几乎因以下消息而崩溃:

shell-init:检索当前目录时出错:getcwd:无法访问父目录:没有这样的文件或目录

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

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