如何获取memcached实例中设置的所有密钥?
我尝试使用Google搜索,但除了PHP
支持getAllKeys
method之外没有找到太多,这意味着实际上可以以某种方式执行此操作。如何在telnet会话中获得相同的内容?
我已经尝试了memcached cheat sheet和Memcached telnet command summary中提到的所有与检索相关的选项,但这些选项都不起作用,我无法找到正确的方法来执行此操作。
注意:我目前正在开发中,因此可以假设由于设置了新密钥或其他类似的竞争条件而没有问题,并且密钥的数量也将受到限制。
答案 0 :(得分:153)
找到一种方法,感谢link here(原始google group discussion here)
首先,Telnet
到您的服务器:
telnet 127.0.0.1 11211
接下来,列出要获取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
答案 1 :(得分:52)
memdump
有一个memdump
命令(Ubuntu中的memcdump
,libmemcached-tools
的一部分),例如:
memdump --servers=localhost
将返回所有键。
memcached-tool
在memcached
的最新版本中,还有 memcached-tool
命令,例如。
memcached-tool localhost:11211 dump | less
转储所有键和值。
另见:
答案 2 :(得分: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'
它做什么,它遍历所有缓存板并打印每个缓存板的1000个条目。
请注意此脚本的某些限制,例如,它可能无法扩展为5GB缓存服务器。但它对于本地计算机上的调试非常有用。
答案 3 :(得分:8)
如果你有PHP&安装了PHP-memcached,可以运行
$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
答案 4 :(得分:6)
要获取Bash中的键列表,请按照以下步骤操作。
首先,定义以下包装器函数以使其易于使用(将其复制并粘贴到外壳中):
function memcmd() {
exec {memcache}<>/dev/tcp/localhost/11211
printf "%s\n%s\n" "$*" quit >&${memcache}
cat <&${memcache}
}
您可以使用lru_crawler metadump all
命令转储(所有)缓存中所有项目的元数据。
与
cachedump
相比,它不会引起严重的性能问题,并且对可以转储的密钥数量没有限制。
使用先前定义的功能的示例命令:
memcmd lru_crawler metadump all
请参阅:ReleaseNotes1431。
使用items statistics命令获取平板列表,例如:
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。
相关:
protocol.txt
文档文件。答案 5 :(得分:5)
最简单的方法是使用python-memcached-stats包,https://github.com/abstatic/python-memcached-stats
keys()方法应该让你前进。
示例 -
<script type="text/javascript">
require(
{
baseUrl: '@Url.Content("~/Content/js")',
waitSeconds: 45,
paths:
{
// dependencies here ex. jquery
}
});
</script>
答案 6 :(得分:0)
我使用的是 Java 的 spyMemcached,并使用了此代码。它基于 Anshul Goyal's answer
if (System.IO.File.Exists(path))
{
try
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(path);
}
catch (Exception e) { }
}