【问题标题】:Memcached: How to break the limitation when retrieving all keysMemcached:检索所有键时如何打破限制
【发布时间】:2016-07-22 13:51:12
【问题描述】:

由于我在网络中找不到任何可靠的程序,一旦平板中的密钥计数> 500k,我就想用 PHP 编写自己的程序。

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

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

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

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

我正在使用memcached 1.4.25

【问题讨论】:

  • 注意:根据我的发现,stats cachedump .... 仅受 memcached 的文本协议版本支持(例如,当通过 telnet 或客户端库连接到 memcached 时)。如果您使用带有二进制协议(和 SASL)的现代 memcached 配置,那么似乎不可能运行像 stats cachedump 1 100 这样的东西。因此,似乎在使用二进制协议时,您既不能调用 get-all-keys 也不能调用 cachedump

标签: php memcached


【解决方案1】:

在调试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:检索当前目录时出错:getcwd:无法访问 父目录:没有这样的文件或目录

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2011-08-07
    • 2012-06-25
    • 1970-01-01
    • 2018-04-08
    • 2015-10-15
    相关资源
    最近更新 更多