Какой самый простой способ получить дамп всех ключей memcached в файл?

Это только с одного сервера memcached с около 20M ключей (без срока действия) и около 2G данных.

Какой самый простой способ получить дамп всех пар ключ / значение в плоский файл? Сначала я посмотрел на java net.spy.memcached.MemcachedClient, но этот клиент не поддерживает получение всех ключей (я думаю). Если бы у меня был список всех ключей (чего у меня нет), я мог бы легко использовать этот клиент, чтобы получить все значения.

Я знаю, что могу получить все ключи, используя некоторые команды telnet (например, telnet localhost 11211; элементы статистики; кэш-память статистики), но мне не ясно, как автоматизировать это надежно.

РЕДАКТИРОВАТЬ: Вот что я сделал, чтобы заставить это работать на игрушечном сервере 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");
                }
            }
        }
    }
}
?>

РЕДАКТИРОВАТЬ 2: приведенный выше сценарий, кажется, не возвращает все сопоставления. Если я вставлю строкуcount($entries), он возвращает только чуть более 50 тыс., даже если для параметра limit установлено 100M, но выполняетсяstats items из Telnet показывает более 5 миллионов записей. Кто-нибудь знает, почему это может иметь место?

EDIT3: этоссылка предполагает, что cachedump не получает все ключи из memcached. Я достиг предела около 50 тыс. Ключей, которые возвращаются либо cachedump, этим PHP-скриптом, либо perl-скриптом, похожим на тот, который приведен в ссылке, предоставленной Заком Бонхэмом. Есть ли способ обойти это?

Ответы на вопрос(5)

Ваш ответ на вопрос