Какой самый простой способ получить дамп всех ключей memcached в файл?
Это только с одного сервера memcached с около 20M ключей (без срока действия) и около 2G данных.
Какие'самый простой способ получить дамп всех пар ключ / значение в плоский файл? Сначала я посмотрел на java net.spy.memcached.MemcachedClient, но этот клиент не поддерживает получение всех ключей (я думаю). Если бы у меня был список всех ключей (которые я неt) я мог бы легко использовать этот клиент, чтобы получить все значения.
Я знаю, что могу получить все ключи, используя некоторые команды 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 скрипт, основанный наэтот:
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-скриптом, похожим на тот, который приведен в ссылке, предоставленной Заком Бонхэмом. Есть ли способ обойти это?