这些内容是关于一个只有一个Memcached服务器的,大约有20M个键(没有到期时间)和大约2G数据的描述。
获取所有键/值对到一个平面文件中的最简单方法是什么?我首先查看了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
基于这个的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");
}
}
}
}
}
?>
编辑2: 上述脚本似乎不能返回所有映射关系。如果我插入行count($entries)
,即使将限制参数设置为100M,它也仅返回略多于50k条数据,但是通过telnet执行stats items
则显示有超过5M的记录。有人知道这可能是什么原因吗?
编辑3: 这个链接表明,缓存转储并不能从memcached中获取所有键。我已经遇到了大约50k个键的限制,无论是通过cachedump,这个PHP脚本还是类似Zach Bonham提供的链接中的perl脚本返回的。有没有什么方法可以解决这个问题?