获取memcached中设置的所有键

mu *_*u 無 122 memcached get key telnet

如何获取memcached实例中设置的所有键?

我尝试使用谷歌搜索,但除了PHP支持getAllKeys方法之外没有找到太多,这意味着实际上可以以某种方式做到这一点.如何在telnet会话中获得相同的内容?

我已经尝试了memcached备忘单Memcached telnet命令摘要中提到的所有检索相关选项,但它们都不起作用,我无法找到正确的方法来执行此操作.

注意:我目前正在开发中进行此操作,因此可以假设由于设置了新密钥或其他此类竞争条件而没有问题,并且密钥的数量也将受到限制.

mu *_*u 無 165

找到了一种方法,感谢这里链接(这里有原始的谷歌小组讨论)

首先,Telnet到您的服务器:

telnet 127.0.0.1 11211
Run Code Online (Sandbox Code Playgroud)

接下来,列出要获取slab id的项目:

stats items
STAT items:3:number 1
STAT items:3:age 498
STAT items:22:number 1
STAT items:22:age 498
END

'items'之后的第一个数字是slab id.请求每个slab id的缓存转储,并限制要转储的最大键数:

stats cachedump 3 100
ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
END

stats cachedump 22 100
ITEM views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
END

  • 还有 `lru_crawler metadump all` 将转储所有缓存键,而不是“只是”前 1M .. https://github.com/memcached/memcached/blob/bb0980fbbafd4eb723f76918e7ca364360315c1b/doc/protocol.txt#L548 (4认同)
  • 请注意,stats cachedump是一个未记录的功能,memcached团队不支持.它仅用于调试,不用于生产用途. (3认同)
  • `b`是字节,`s`是纪元时间秒 (3认同)
  • @Dan 也许您首先查看的是活动答案,这会根据他们上次活动的时间对答案帖子进行排序。如果是,您可以通过从问题文本正下方选择活动/最旧/投票之一来更改它。除此之外,此答案在隐身模式下位于顶部。 (2认同)

ken*_*orb 55

memdump

有一个memcdump命令(memdump在Ubuntu中,部分libmemcached-tools),例如:

memcdump --servers=localhost
Run Code Online (Sandbox Code Playgroud)

这将返回所有键.


memcached-tool

在最近的版本中memcached还有memcached-tool命令,例如

memcached-tool localhost:11211 dump | less
Run Code Online (Sandbox Code Playgroud)

转储所有键和值.

也可以看看:

  • 小心!`memcached-tool`的`dump`子命令似乎清除了缓存:(可能首先使用`display`或`stats`更安全. (5认同)
  • 在Ubuntu Xenial中,包含memdump的包称为`libmemcached-tools`,而工具的二进制文件则称为memcdump. (4认同)
  • 对于那些寻找`memcached-tool`的人来说,它有点隐藏在一个目录中,可能不在标准的`PATH`中 - 至少在Ubuntu Xenial上 - 这里:`/ usr/share/memcached/scripts /` (4认同)
  • 小心'memdump'这个命令是一个让你的终端崩溃的好方法. (3认同)

Oma*_*awi 15

基于@mu无在这里回答.我写了一个缓存转储脚本.

该脚本转储memcached服务器的所有内容.它已经使用Ubuntu 12.04和本地主机memcached进行了测试,因此您的milage可能会有所不同.

#!/usr/bin/env bash

echo 'stats items'  \
| nc localhost 11211  \
| grep -oe ':[0-9]*:'  \
| grep -oe '[0-9]*'  \
| sort  \
| uniq  \
| xargs -L1 -I{} bash -c 'echo "stats cachedump {} 1000" | nc localhost 11211'
Run Code Online (Sandbox Code Playgroud)

它做什么,它遍历所有缓存板并打印每个缓冲区的1000个条目.

请注意此脚本的某些限制,例如,它可能无法扩展为5GB缓存服务器.但它对于本地计算机上的调试非常有用.

  • 在Debian 8上使用`memcached 1.4.21-1.1 + deb8u1`我必须显式向memcached发送一个quit命令.我修改了你的命令,现在正常工作:`echo -e"stats items \nquit"| nc localhost 11211 | grep -oe':[0-9]*:'| grep -oe'[0-9]*'| 排序| uniq | xargs -L1 -I {} bash -c'echo -e"stats cachedump {} 1000 \nquit"| nc localhost 11211'`感谢分享这个!非常有用的调试:) (3认同)

Rou*_*dre 11

如果安装了PHP和PHP-memcached,则可以运行

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
Run Code Online (Sandbox Code Playgroud)

  • @WolfgangBlessen-这是由于memcached中的错误-在最新版本中已修复。https://github.com/php-memcached-dev/php-memcached/issues/203 (2认同)

ken*_*orb 7

重击

要获取Bash中的键列表,请按照以下步骤操作。

首先,定义以下包装器函数以使其易于使用(将其复制并粘贴到shell中):

function memcmd() {
  exec {memcache}<>/dev/tcp/localhost/11211
  printf "%s\n%s\n" "$*" quit >&${memcache}
  cat <&${memcache}
}
Run Code Online (Sandbox Code Playgroud)

Memcached 1.4.31及以上

您可以使用lru_crawler metadump all命令转储(所有)缓存中所有项目的元数据。

与相对cachedump,它不会引起严重的性能问题,并且对可以转储的密钥数量没有限制。

使用先前定义的函数的示例命令:

memcmd lru_crawler metadump all
Run Code Online (Sandbox Code Playgroud)

请参阅:ReleaseNotes1431


Memcached 1.4.30及以下

使用项目统计信息命令获取平板列表,例如:

memcmd stats items
Run Code Online (Sandbox Code Playgroud)

对于每个slub类,您可以通过指定slub id以及限制数(0-无限制)来获得项目列表:

memcmd stats cachedump 1 0
memcmd stats cachedump 2 0
memcmd stats cachedump 3 0
memcmd stats cachedump 4 0
...
Run Code Online (Sandbox Code Playgroud)

注意:您需要为每个内存缓存服务器执行此操作。

要列出所有存根中的所有密钥,这是一列式(每台服务器):

for id in $(memcmd stats items | grep -o ":[0-9]\+:" | tr -d : | sort -nu); do
    memcmd stats cachedump $id 0
done
Run Code Online (Sandbox Code Playgroud)

注意:上面的命令在访问项目时可能会导致严重的性能问题,因此建议不要实时运行。


笔记:

stats cachedump仅转储HOT_LRU(IIRC?),该活动在活动发生时由后台线程进行管理。这意味着在启用2Q算法的足够新的版本下,您将仅获得其中一个LRU的快照视图。

如果您想查看所有内容,lru_crawler metadump 1(或lru_crawler metadump all)是新的官方支持的新方法,该方法将异步转储任意数量的键。您将使它们乱序,但会击中所有LRU,除非您删除/替换项目,否则多次运行将产生相同的结果。

资料来源:GH-405


有关:


abh*_*k_M 5

最简单的方法是使用python-memcached-stats包,https://github.com/abstatic/python-memcached-stats

keys()方法应该让你前进.

示例 -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]
Run Code Online (Sandbox Code Playgroud)