LoginSignup
1
1

More than 5 years have passed since last update.

Memcachedから全データをDumpしたメモ

Posted at

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に保存した中身を比較して差分を確認した方がよさそう。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1