这仅来自一个具有大约20M密钥(没有到期)和大约2G数据的memcached服务器.
将所有键/值对转储到平面文件中的最简单方法是什么?我首先查看了java net.spy.memcached.MemcachedClient,但是这个客户端不支持获取所有密钥(我认为).如果我有一个所有键的列表(我没有),我可以轻松地使用此客户端获取所有值.
我知道我可以使用一些telnet命令获取所有密钥(例如,telnet localhost 11211; stats items; stats cachedump),但我不清楚如何自动执行此操作.
编辑:这是我在我的机器上的玩具memcached服务器上做的工作.它似乎工作但我只在memcached中放了两个键,所以希望这个方法可以扩展好:
shell命令:
sudo yum install memcached
sudo /etc/init.d/memcached restart # maybe unnecessary
sudo yum install php
sudo yum install php-pecl-memcache
sudo service httpd reload
Run Code Online (Sandbox Code Playgroud)
php脚本,基于此:
<?php
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$list = array();
$allSlabs = $memcache->getExtendedStats('slabs');
$items = $memcache->getExtendedStats('items');
foreach($allSlabs as $server => $slabs) {
foreach($slabs AS $slabId => $slabMeta) {
if (!is_int($slabId)) {
continue;
}
$cdump = $memcache->getExtendedStats('cachedump', (int) $slabId, 100000000);
foreach($cdump AS $server => $entries) {
if ($entries) {
foreach($entries AS $eName => $eData) {
print_r($eName);
print_r(":");
$val = $memcache->get($eName);
print_r($val);
print_r("\n");
}
}
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
EDIT2:上面的脚本似乎没有返回所有的映射.如果我插入该行count($entries),即使limit参数设置为100M,它也只返回超过50k,但是stats items从telnet 执行显示超过500万个条目.有谁知道为什么会这样?
EDIT3:此链接表明cachedump没有从memcached获取所有密钥.我已经达到了大约50k键的限制,这些键由cachedump,这个PHP脚本或类似于Zach Bonham提供的链接中的perl脚本返回.有没有办法解决?
Zac*_*ham 13
免责声明:我不知道我在做什么,只是听起来像一个有趣的问题.
你看到这篇文章了吗? Lars Windolf的"如何从Memcache转储密钥".
来自文章:
Memcache本身提供了进入数据峰值的方法.该协议提供了进入由slabs组织的数据的命令(给定大小范围的数据类别.但是有一些重要的限制:
- 您只能按每个slab类转储键(内容大小大致相同的键)
- 每个slab类只能转储一页(1MB数据)
- 这是一个非官方的功能,可能会随时删除.
实际上,它需要一些关于memcache如何将数据存储在内存中的知识(我没有).你需要找到每个'slab',然后你可以转储该slab的键,最后是这些键的值.
本文中有一个工具部分,它使用各种语言至少转储密钥,但只有perl脚本转储密钥和值.
这是我用来将所有对象转储到相应文件中的脚本:
while read -r key; do
[ -f "$key" ] || echo "get $key" | nc localhost 11211 > "$key.dump";
done < <(memcdump --server localhost)
Run Code Online (Sandbox Code Playgroud)
它使用的memcdump命令应该是 memcached utils 的一部分。
对于压缩对象,请参阅:如何从 Memcache 转储给定键的压缩对象?
要从服务器转储密钥列表,请使用memcdump/memdump工具,例如
memcdump --servers=localhost | tee my_keys.lst
Run Code Online (Sandbox Code Playgroud)
要打印一项的值,请使用netcat:
echo "get 13456_-cache-some_object" | nc localhost 11211
Run Code Online (Sandbox Code Playgroud)
通过memcdump/memdump和将所有对象转储到屏幕中netcat:
memcdump --servers=localhost | xargs -L1 -I% sh -c 'echo "get %" | nc localhost 11211'
Run Code Online (Sandbox Code Playgroud)
在最近的版本中memcached还有memcached-tool命令,例如
memcached-tool localhost:11211 dump | less # dumps keys and values
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41358 次 |
| 最近记录: |