From 390a270b1e846a127a3dfd40fb6fafe7f9d27912 Mon Sep 17 00:00:00 2001 From: Chris Cormack Date: Wed, 26 Aug 2009 19:07:50 +1200 Subject: [PATCH] Modules for caching - C4::Cache is the base class, C4::Cache::Memcached and C4::Cache::FastMemcached are subclasses Signed-off-by: Galen Charlton --- C4/Cache.pm | 81 +++++++++++++++++++++++++++++++++ C4/Cache/FastMemcached.pm | 95 +++++++++++++++++++++++++++++++++++++++ C4/Cache/Memcached.pm | 76 +++++++++++++++++++++++++++++++ 3 files changed, 252 insertions(+) create mode 100644 C4/Cache.pm create mode 100644 C4/Cache/FastMemcached.pm create mode 100644 C4/Cache/Memcached.pm diff --git a/C4/Cache.pm b/C4/Cache.pm new file mode 100644 index 0000000000..6d55b25286 --- /dev/null +++ b/C4/Cache.pm @@ -0,0 +1,81 @@ +package C4::Cache; + +# Copyright 2009 Chris Cormack and The Koha Dev Team +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA + +=head1 NAME + + C4::Cache - Handling caching of html and Objects for Koha + +=head1 SYNOPSIS + + use C4::Cache (cache_type => $cache_type, %params ); + + +=head1 DESCRIPTION + + Base class for C4::Cache::X. Subclasses need to provide the following methods + + B<_cache_handle ($params_hr)> - cache handle creator + B + B + B + B + +=head1 FUNCTIONS + +=cut + +use strict; +use warnings; +use Carp; + +use base qw(Class::Accessor); + +use C4::Cache::Memcached; +use C4::Cache::FastMemcached; + +__PACKAGE__->mk_ro_accessors( qw( cache ) ); + +sub new { + my $class = shift; + my %param = @_; + + my $cache_type = $param{cache_type} || 'memcached'; + my $subclass = __PACKAGE__."::".ucfirst($cache_type); + my $cache = $subclass->_cache_handle(\%param) + or croak "Cannot create cache handle for '$cache_type'"; + return bless $class->SUPER::new({cache => $cache}), $subclass; +} + +=head2 EXPORT + + None by default. + +=head1 SEE ALSO + + C4::Cache::Memcached + +=head1 AUTHOR + +Chris Cormack, Echris@bigballofwax.co.nzE + +=cut + +1; + +__END__ diff --git a/C4/Cache/FastMemcached.pm b/C4/Cache/FastMemcached.pm new file mode 100644 index 0000000000..d0a0fdefa9 --- /dev/null +++ b/C4/Cache/FastMemcached.pm @@ -0,0 +1,95 @@ +package Koha::Cache::FastMemcached; + +# Copyright 2009 Chris Cormack and The Koha Dev Team +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA + +use strict; +use warnings; +use Carp; + +use Cache::Memcached::Fast; +use IO::Compress::Gzip; +use IO::Uncompress::Gunzip; +use Storable; + +use base qw(C4::Cache); + +sub _cache_handle { + my $class = shift; + my $params = shift; + + my @servers = split /,/, $params->{'cache_servers'}; + + return Cache::Memcached::Fast->new( + { + servers => \@servers, + namespace => $params->{'namespace'} || 'KOHA', + connect_timeout => $params->{'connect_timeout'} || 2, + io_timeout => $params->{'io_timeout'} || 2, + close_on_error => 1, + compress_threshold => 100_000, + compress_ratio => 0.9, + compress_methods => + [ \&IO::Compress::Gzip::gzip, \&IO::Uncompress::Gunzip::gunzip ], + max_failures => 3, + failure_timeout => 2, + ketama_points => 150, + nowait => 1, + hash_namespace => 1, + serialize_methods => [ \&Storable::freeze, \&Storable::thaw ], + utf8 => 1, + } + ); +} + +sub set_in_cache { + my ( $self, $key, $value, $expiry ) = @_; + croak "No key" unless $key; + + if ( defined $expiry ) { + return $self->cache->set( $key, $value, $expiry ); + } + else { + return $self->cache->set( $key, $value ); + } +} + +sub get_from_cache { + my ( $self, $key ) = @_; + croak "No key" unless $key; + return $self->cache->get($key); +} + +sub clear_from_cache { + my ( $self, $key ) = @_; + croak "No key" unless $key; + return $self->cache->delete($key); +} + +sub flush_all { + my $self = shift; + return $self->cache->flush_all; +} + +1; +__END__ + +=head1 NAME + + C4::Cache::FastMemcached - memcached::fast subclass of C4::Cache + +=cut diff --git a/C4/Cache/Memcached.pm b/C4/Cache/Memcached.pm new file mode 100644 index 0000000000..67ee420404 --- /dev/null +++ b/C4/Cache/Memcached.pm @@ -0,0 +1,76 @@ +package C4::Cache::Memcached; + +# Copyright 2009 Chris Cormack and The Koha Dev Team +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA + +use strict; +use warnings; +use Carp; + +use Cache::Memcached; + +use base qw(C4::Cache); + +sub _cache_handle { + my $class = shift; + my $params = shift; + + my @servers = split /,/, $params->{'cache_servers'}; + + return Cache::Memcached->new( + servers => \@servers, + namespace => $params->{'namespace'} || 'KOHA', + ); +} + +sub set_in_cache { + my ( $self, $key, $value, $expiry ) = @_; + croak "No key" unless $key; + + if ( defined $expiry ) { + return $self->cache->set( $key, $value, $expiry ); + } + else { + return $self->cache->set( $key, $value ); + } +} + +sub get_from_cache { + my ( $self, $key ) = @_; + croak "No key" unless $key; + return $self->cache->get($key); +} + +sub clear_from_cache { + my ( $self, $key ) = @_; + croak "No key" unless $key; + return $self->cache->delete($key); +} + +sub flush_all { + my $self = shift; + return $self->cache->flush_all; +} + +1; +__END__ + +=head1 NAME + + C4::Cache::Memcached - memcached subclass of C4::Cache + +=cut -- 2.39.5