POEでmemcachedらしきものをつくってみる

perlPOEを使ってmemcachedを再現してみました。
esecached.pl
memcachedの偽物なので、こんな名前です。

できるのはset,get,delete,flush_allだけ。flagもexptimeも無視します(笑)。
Cache::Memcachedを騙せる事を確認しました。

POEをはじめて使ったので割とテキトーです。
動けば良いかな程度に作ってます。

use warnings;
use strict;
use POE;
use POE::Component::Server::TCP;

my $ESECACHE_DATA = {};
my $port = 11211;

POE::Component::Server::TCP->new(
     Port               => $port,
     ClientConnected    => \&handle_client_connect,
     ClientInput        => \&client_input,
     ClientFlushed      => \&handle_client_flush,   
     Concurrency        => -1,
    );
 
POE::Kernel->run;
exit;


sub handle_client_connect{
    my ($kernel, $heap, $input) = @_[KERNEL, HEAP, ARG0];
    my $id = $heap->{client}->ID;
    $heap->{'input_buff'.$id} = [''];
}
 
sub handle_client_flush {
    my ( $heap, $input ) = @_[HEAP, ARG0];
}

sub client_input {
    my ($kernel, $heap, $input) = @_[KERNEL, HEAP, ARG0];

    my $id = $heap->{client}->ID;
    my $input_buff = $heap->{'input_buff'.$id};

    if( $input_buff->[0] =~ /^set\ (\S+)\ \d+\ \d+\ \d+/i ){
        my $key = $1;
        $ESECACHE_DATA->{$key} = $input;
        $heap->{client}->put('STORED');
    }
    elsif( $input =~ /^get\ (\S+)/i ){
        my $key = $1;
        my $value = $ESECACHE_DATA->{$key};
        my $l = length($value);
        $heap->{client}->put("VALUE $key 0 $l");
        $heap->{client}->put($value);
        $heap->{client}->put("END");
    }
    elsif( $input =~ /^flush_all/i ){
        $ESECACHE_DATA = {};
        $heap->{client}->put('OK');
    }
    elsif( $input =~ /^delete\ (\S+)/i ){
        my $key = $1;
        if( $ESECACHE_DATA->{$key} ){
            $ESECACHE_DATA->{$key} = '';
            $heap->{client}->put("DELETED");
        }
        else{
            $heap->{client}->put("NOT_FOUND");
        }
    }
    elsif( $input =~ /^quit/i ){
        $heap->{shutdown} = 1;
        $heap->{client}->put("quit");
    }
    else{
        $heap->{client}->put("ERROR");
    }

    unshift @{$heap->{'input_buff'.$id}},$input;
}

__END__