Memcachedに大量のデータが保存されている場合、たいていの場合は全データをDumpすることができない。(Memcachedのメモリ設定によるけどデフォルトは1Mか2M分しか出力できないようになっている。)
そのため、Dumpするときは特殊な方法が必要だった。
今回は、Memcachedから出力できるだけデータをDump→Redisに保存→(テキストに保存)→getで対象のデータがRedisに保存されていることを確認→Dumpしたデータを削除→MemcachedからDump…を繰り返して行った。
open(DATAFILE, ">", $self->{filename}) or die("Error:$!");
while (1) {
# 全データを取得するための処理
my $memc_dump_text = MemcachedTool->dump($host, $port);
unless ($memc_dump_text) {
last;
}
my @lines = split /\r\n|\n/, $memc_dump_text;
my @keys;
for (my $i=0; $i<@lines; $i=$i+1) {
if ($lines[$i] =~ /^add /) {
my (undef, $key, $flag, $ttl, $len) = split /\s/, $lines[$i];
if (my $value = $lines[$i+1]) {
unless ($value && $key) {
next;
}
$self->redis->set( $key => $value, sub {} );
$self->redis->expire( $key => $ttl, sub {} );
if ($self->redis->get( $key )) {
push (@keys, $key);
print DATAFILE $lines[$i] . "\t" . encode_json($value) . "\n";
}
}
}
}
$self->memcached->delete_multi(@keys);
}
close(DATAFILE);
念のため、出力したテキストとRedisに保存した中身を比較して差分を確認した方がよさそう。