package OpenResty::Cache; use strict; use warnings; use FindBin; # This is a hack... our $NoTrivial = 0; sub new { my $class = ref $_[0] ? ref shift : shift; my $params = shift; my $type = $OpenResty::Config{'cache.type'} or die "No cache.type specified in the config files.\n"; my $obj; my $self = bless {}, $class; if ($type eq 'filecache') { require Cache::FileCache; $obj = Cache::FileCache->new( { namespace => 'OpenResty', default_expires_in => 60 * 60 * 24 } ); } elsif ($type eq 'memcached') { my $list = $OpenResty::Config{'cache.servers'} or die "No cache.servers specified in the config files.\n"; require Cache::Memcached::libmemcached; my @addr = split /\s*,\s*|\s+/, $list; if (!@addr) { die "No memcached server found: $list.\n"; } $obj = Cache::Memcached::libmemcached->new({ servers => [@addr], }); #$obj->set(dog => 32); #die "Dog value: ", $obj->get('dog'); #die $obj; } else { die "Invalid cache.type value: $type\n"; } my $backend_type = $OpenResty::Config{'backend.type'} || ''; $NoTrivial = $OpenResty::Config{'backend.recording'} || $backend_type eq 'PgMocked'; if ($obj->can('purge')) { $obj->purge(); } $self->{obj} = $obj; return $self; } # expire_in is in seconds... sub set { my ($self, $key, $val, $expire_in, $trivial) = @_; return undef if $trivial && $NoTrivial; $self->{obj}->set($key, $val, $expire_in); } sub get { my ($self, $key, $trivial) = @_; return undef if $NoTrivial && $trivial; $self->{obj}->get($key); } sub remove { my $self = shift; my $obj = $self->{obj}; if ($obj->can('remove')) { $obj->remove(@_); } else { $obj->delete(@_); } } ## ------------------------ sub get_has_user { my ($self, $user) = @_; $self->get("hasuser:$user", 'trivial') } sub set_has_user { my ($self, $user) = @_; $self->set("hasuser:$user", 1, 3600, 'trivial'); } sub remove_has_user { my ($self, $user) = @_; $self->remove("hasuser:$user"); } sub get_last_res { my ($self, $id) = @_; $self->get("lastres:$id"); } sub set_last_res { my ($self, $id, $val) = @_; $self->set("lastres:$id", $val, 5 * 60); } sub remove_last_res { my ($self, $id) = @_; $self->remove("lastres:".$id); } sub get_has_model { my ($self, $user, $model) = @_; $self->get("hasmodel:$user:$model", 'trivial') } sub set_has_model { my ($self, $user, $model) = @_; $self->set("hasmodel:$user:$model", 1, 3600, 'trivial'); } sub remove_has_model { my ($self, $user, $model) = @_; $self->remove("hasmodel:$user:$model"); } sub get_has_view { my ($self, $user, $view) = @_; #return undef; $self->get("hasview:$user:$view", 'trivial') } sub set_has_view { my ($self, $user, $view) = @_; $self->set("hasview:$user:$view", 1, 3600, 'trivial'); } sub remove_has_view { my ($self, $user, $view) = @_; $self->remove("hasview:$user:$view"); } sub get_view_def { my ($self, $user, $view) = @_; #return undef; $self->get("viewdef:$user:$view", 'trivial') } sub set_view_def { my ($self, $user, $view, $def) = @_; $self->set("viewdef:$user:$view", $def, 3600, 'trivial'); } sub remove_view_def { my ($self, $user, $view) = @_; $self->remove("viewdef:$user:$view"); } sub get_has_role { my ($self, $user, $role) = @_; #return undef; $self->get("hasrole:$user:$role", 'trivial') } sub set_has_role { my ($self, $user, $role, $login_meth) = @_; $self->set("hasrole:$user:$role", $login_meth, 3600, 'trivial'); } sub remove_has_role { my ($self, $user, $role) = @_; $self->remove("hasrole:$user:$role"); } sub get_has_action { my ($self, $user, $action) = @_; #return undef; $self->get("hasrole:$user:$action", 'trivial') } sub set_has_action { my ($self, $user, $action, $compiled) = @_; $self->set("hasrole:$user:$action", $compiled, 3600, 'trivial'); } sub remove_has_action { my ($self, $user, $action) = @_; $self->remove("hasrole:$user:$action"); } 1; __END__ =head1 NAME OpenResty::Cache - Cache for OpenResty =head1 SYNOPSIS use OpenResty::Config; use OpenResty::Cache; OpenResty::Config->init; my $cache = OpenResty::Cache->new; $cache->set('key' => 'value'); # use the cache to store (session) data $cache->set('key' => 'value', 'trivial'); # pure caching print $cache->get('key'); # read the value for the key $cache->remove('key'); =head1 DESCRIPTION This class provides an abstract interface for two caching libraries, L<Cache::FileCache> and L<Cache::Memcached::libmemcached>. Which underlying cache library to use depends on the C<cache.type> config option in the F<etc/site_openresty.conf> file. Note that C<filecache> could eat up your hard disk very quickly. (you'll observe the bloating directory F</tmp/FileCache>.) C<filecache> is only suitable for development; for production use, please use C<memcached> instead (by specifying the C<cache.type> and C<cache.servers> options in F<etc/site_openresty.conf>). =head1 METHODS =over =back =head1 AUTHOR Agent Zhang (agentzh) C<< <agentzh@yahoo.cn> >>. =head1 SEE ALSO L<OpenResty>, L<Cache::FileCache>, L<Cache::Memcached::libmemcached>.