Cache-Elasticache-Memcache
view release on metacpan or search on metacpan
lib/Cache/Elasticache/Memcache.pm view on Meta::CPAN
delete_multi
touch
touch_multi
flush_all
nowait_push
server_versions
disconnect_all
);
foreach my $method (@methods) {
my $method_name = "Cache::Elasticache::Memcache::$method";
no strict 'refs';
*$method_name = sub {
my $self = shift;
$self->checkServers;
return $self->{'_memd'}->$method(@_);
};
}
=pod
=item checkServers
my $memd = Cache::Elasticache::Memcache->new({
config_endpoint => 'foo.bar'
})
...
$memd->checkServers();
Trigger the the server list to be updated if the time passed since the server list was last updated is greater than the update period (default 180 seconds).
=cut
sub checkServers {
my $self = shift;
$self->{_current_update_period} = (defined $self->{_current_update_period}) ? $self->{_current_update_period}: $self->{update_period} - rand(10);
if ( defined $self->{'config_endpoint'} && (time - $self->{_last_update}) > $self->{_current_update_period} ) {
$self->updateServers();
$self->{_current_update_period} = undef;
}
}
=pod
=item updateServers
my $memd = Cache::Elasticache::Memcache->new({
config_endpoint => 'foo.bar'
})
...
$memd->updateServers();
This method will update the server list regardles of how much time has passed since the server list was last checked.
=cut
sub updateServers {
my $self = shift;
my $servers = $self->getServersFromEndpoint($self->{'config_endpoint'});
## Cache::Memcached::Fast does not support updating the server list after creation
## Therefore we must create a new object.
if ( $self->_hasServerListChanged($servers) ) {
$self->{_args}->{servers} = $servers;
$self->{_memd} = Cache::Memcached::Fast->new($self->{'_args'});
}
$self->{servers} = $servers;
$self->{_last_update} = time;
}
sub _hasServerListChanged {
my $self = shift;
my $servers = shift;
return 1 unless (scalar(@$servers) == scalar(@{$self->{'servers'}}));
return 1 unless (join('|',sort(@$servers)) eq join('|',sort(@{$self->{'servers'}})));
return 0;
}
=pod
=back
=head1 CLASS METHODS
=over
=item getServersFromEndpoint
Cache::Elasticache::Memcache->getServersFromEndpoint('foo.bar');
This class method will retrieve the server list for a given configuration endpoint.
=cut
sub getServersFromEndpoint {
my $invoker = shift;
my $config_endpoint = shift;
my $data = "";
# TODO: make use of "connect_timeout" (default 0.5s) and "io_timeout" (default 0.2s) constructor parameters
# my $args = shift;
# $connect_timeout = exists $args->{connect_timeout} ? $args->{connect_timeout} : $class::default_connect_timeout;
# $io_timeout = exists $args->{io_timeout} ? $args->{io_timeout} : $class::default_io_timeout;
my $socket = (blessed($invoker)) ? $invoker->{_sockets}->{$config_endpoint} : undef;
for my $i (0..2) {
unless (defined $socket && $socket->connected()) {
$socket = IO::Socket::IP->new(PeerAddr => $config_endpoint, Timeout => 10, Proto => 'tcp');
croak "Unable to connect to server: ".$config_endpoint." - $!" unless $socket;
$socket->sockopt(SO_KEEPALIVE,1);
$socket->autoflush(1);
IO::Socket::Timeout->enable_timeouts_on($socket);
( run in 1.854 second using v1.01-cache-2.11-cpan-2398b32b56e )