这仅来自具有大约 20M 键(没有过期)和大约 2G 数据的单个 memcached 服务器。
将所有键/值对转储到平面文件中的最简单方法是什么?我首先查看了 java net.spy.memcached.MemcachedClient,但是这个客户端不支持获取所有密钥(我认为)。如果我有一个所有键的列表(我没有),我可以很容易地使用这个客户端来获取所有的值。
我知道我可以使用一些 telnet 命令(例如 telnet localhost 11211; stats items; stats cachedump )获取所有密钥,但我不清楚如何稳健地自动化这个。
编辑:这是我在我的机器上的玩具 memcached 服务器上所做的工作。它似乎有效,但我只在 memcached 中放了两个键,所以希望这种方法可以正常扩展:
外壳命令:
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");
}
}
}
}
}
?>
EDIT2:上面的脚本似乎没有返回所有的映射。如果我插入该行count($entries)
,即使将限制参数设置为 100M,它也只返回 50k 多一点,但从stats items
telnet 执行显示超过 5M 条目。有谁知道为什么会这样?
EDIT3:此链接表明 cachedump 不会从 memcached 获取所有密钥。我已经达到了大约 50k 键的限制,这些键由 cachedump、此 PHP 脚本或类似于 Zach Bonham 提供的链接中的一个 perl 脚本返回。有没有办法解决?