これは、約 20M のキー (有効期限なし) と約 2G のデータを持つ単一の memcached サーバーからのものです。
すべてのキーと値のペアをフラット ファイルにダンプする最も簡単な方法は何ですか? 最初に Java net.spy.memcached.MemcachedClient を見ましたが、このクライアントはすべてのキーの取得をサポートしていません (私はそう思います)。すべてのキーのリストがあれば (私は持っていません)、このクライアントを使用してすべての値を簡単に取得できます。
いくつかの telnet コマンド (例: telnet localhost 11211; stats items; stats cachedump ) を使用してすべてのキーを取得できることは知っていますが、これを確実に自動化する方法がわかりません。
EDIT:これは、私のマシンのおもちゃのmemcachedサーバーでこれを機能させるために私がしたことです。動作しているように見えますが、memcached には 2 つのキーしか入れていないため、この方法で問題なくスケーリングできることを願っています。
シェル コマンド:
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)
と、 limit パラメータが 100M に設定されていても 50k 強しか返されませんが、stats items
telnet から実行すると 5M を超えるエントリが表示されます。なぜこれが当てはまるのか誰にもわかりますか?
EDIT3: このリンクは、cachedump が memcached からすべてのキーを取得しないことを示唆しています。cachedump、この PHP スクリプト、または Zach Bonham が提供するリンクにあるような perl スクリプトのいずれかによって返される約 50,000 個のキーの制限に達しました。これを回避する方法はありますか?