获取在memcached中设置的所有键


131

如何获得在Memcached实例中设置的所有键?

我尝试了谷歌搜索,但是除了PHP支持getAllKeysmethod之外没有发现太多,这意味着实际上可以以某种方式执行此操作。如何在telnet会话中获得相同的信息?

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

注意:我目前正在开发中,因此可以假定不会因设置新密钥或发生其他此类竞争情况而出现问题,并且密钥的数量也将受到限制。


检查我的帖子。我遇到了同样的问题,并且找到了解决方案。
Peter VARGA

github.com/clickalicious/phpmemadmin看起来很有帮助(如果我能弄清楚如何使其与Laravel Homestead Vagrant一​​起使用;目前它没有显示任何键)。
Ryan

Answers:


178

找到了一种方法,这要归功于此处链接此处为原始的Google网上论坛讨论

首先,Telnet到您的服务器:

telnet 127.0.0.1 11211

接下来,列出项目以获取平板ID:

统计项目
STAT项目:3:1
STAT项目:3:年龄498
STAT项目:22:1
STAT项目:22:年龄498
结束

“ items”之后的第一个数字是平板ID。请求每个slab ID的缓存转储,并限制要转储的最大密钥数:

统计信息cachedump 3100
项目views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
结束

统计资料cachedump 22100
项目views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
结束


4
请注意,stats cachedump是一项未记录的功能,且memcached团队不支持。它仅用于调试,不用于生产。
mikewied 13-10-24

哦好的。就像我在问题中说的那样,我目前仅处于开发模式,并且需要进行调试。
mu无

3
b是字节,s是纪元时间秒
亚伯拉罕·桑哈

1
@Dan也许您首先是按活动的答案查看,然后根据答案上次活动的时间对其进行排序。如果是,您可以通过从问题文本下方选择有效/最旧/投票之一来更改它。除此之外,此答案在隐身模式下位于顶部。
mu无

2
还有lru_crawler metadump all,将转储所有缓存键,而不是“只是”第一1M .. github.com/memcached/memcached/blob/...
卡奥斯

65

memdump

该(部分)有一个memcdump(有时是memdump)命令libmemcached-tools,例如:

memcdump --servers=localhost

这将返回所有键。


memcached-tool

在最新版本的memcached也有memcached-tool命令,如

memcached-tool localhost:11211 dump | less

转储所有键和值。

也可以看看:


4
小心“ memdump”,此命令是崩溃终端的好方法。
deweydb

5
小心!的dump子命令memcached-tool似乎清除了缓存:(displaystats
。– MarkHu

4
在Ubuntu Xenial中,包含memdump的软件包称为libmemcached-tools,而该工具的二进制文件称为memcdump。
thenickdude

5
对于那些寻找memcached-tool它的人来说,它有些隐藏在目录中,而目录可能不是标准的PATH-至少在Ubuntu Xenial上-这里:/usr/share/memcached/scripts/
sxc731

17

基于此处的@mu无答案。我已经写了一个缓存转储脚本。

该脚本转储Memcached服务器的所有内容。它已在Ubuntu 12.04和localhost memcached上进行了测试,因此您的里程可能有所不同。

#!/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'

它的作用是遍历所有缓存板,并打印每个缓存板的1000个条目。

请注意此脚本的某些限制,例如,它可能无法扩展到5GB的缓存服务器。但这对于在本地计算机上进行调试很有用。


3
在Debian 8上,memcached 1.4.21-1.1+deb8u1我必须将退出命令明确发送给memcached。我已对此进行了修改,现在可以正常工作:echo -e "stats items\nquit" | nc localhost 11211 | grep -oe ':[0-9]*:' | grep -oe '[0-9]*' | sort | uniq | xargs -L1 -I{} bash -c 'echo -e "stats cachedump {} 1000\nquit" | nc localhost 11211'感谢分享!对于调试非常有用:)
Cha0s

由于某些原因,grep -oe'[0-9] *'在Mac上的iTerm2中不起作用,必须替换为grep -Eo'[0-9] {1,99}'
max4ever

这很漂亮,但是却错过了一些关键,为什么?
用户

14

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

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

1
您需要在addServer之后执行此操作:$c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); 对于较新版本的Memcached
hack4mer,

答案仍然是bool(false):-(
Wolfgang Blessen '18

2
@WolfgangBlessen-这是由于memcached中的错误-在最新版本中已修复。 github.com/php-memcached-dev/php-memcached/issues/203
billynoah

@billynoah Thx,我现在真的看到了结果,memcached开始变得有用了:-)
Wolfgang Blessen

12

重击

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

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

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

Memcached 1.4.31及更高版本

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

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

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

memcmd lru_crawler metadump all

请参阅:ReleaseNotes1431


Memcached 1.4.30及以下

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

memcmd stats items

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

memcmd stats cachedump 1 0
memcmd stats cachedump 2 0
memcmd stats cachedump 3 0
memcmd stats cachedump 4 0
...

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

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

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

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


笔记:

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

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

资料来源:GH-405


有关:


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',
 ... ]

1
你甚至可以在命令行用做python -m memcached_stats <ip> <port>
马亭

1
目前仅限Python2。
马吕斯

返回的键数或大小是否有限制?
loknath
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.