Это всего лишь один сервер memcached с 20 М ключами (без истечения срока действия) и около 2 Г данных.
Какой самый простой способ получить дамп всех пар ключ/значение в плоский файл? Сначала я посмотрел на java net.spy.memcached.MemcachedClient, но этот клиент не поддерживает получение всех ключей (я думаю). Если бы у меня был список всех ключей (чего у меня нет), я мог бы легко использовать этот клиент для получения всех значений.
Я знаю, что могу получить все ключи, используя некоторые команды telnet (например, telnet localhost 11211, stats items; stats cachedump), но мне не ясно, как автоматизировать это надежно.
EDIT: Вот что я сделал, чтобы это работало на игрушечном сервере 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: Вышеупомянутый script, похоже, не возвращает все сопоставления. Если я вставляю строку count($entries)
, она возвращает только немного более 50 тыс., Даже если параметр предела установлен в 100 М, но выполнение stats items
из telnet показывает более 5 М записей. Кто-нибудь знает, почему это может быть так?