The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Tie::Cache::Autoupdater - Cache that automatically updated

VERSION

This documentation refers to <Tie::Cache::Autoupdater> version 0.21

AUTHOR

<Anton Morozov> (<antonfin@cpan.org>)

SYNOPSIS

        use Tie::Cache::Autoupdate;

        tie my %cache, 'Tie::Cache::Autoupdate', 
            key1 => { source => sub { ....; return $ref },  timeout => 10 },
            key2 => { source => \&get_data_from_db,         timeout => 30 },
            key2 => { source => \&get_data_from_file,       timeout => 60 };

        my ( $data1, $data2, $data3 );

        $data1 = $cache{key1};   # data, that return anonymous subroutine
        $data2 = $cache{key2};   # data, that return get_data_from_db
        $data3 = $cache{key3};   # data, that return get_data_from_file

        ##########################     2 seconds ago    #######################

        $data1 = $cache{key1};   # update data, call anonymous subroutine
        $data2 = $cache{key2};   # old data, nothing called
        $data3 = $cache{key3};   # old data, nothing called

        ##########################     15 seconds ago    ######################

        $data1 = $cache{key1};   # update data, call anonymous subroutine
        $data2 = $cache{key2};   # update data, call get_data_from_db
        $data3 = $cache{key3};   # old data, nothing called

        ##########################    1 minute 10 seconds ago    ##############

        $data1 = $cache{key1};   # update data, call anonymous subroutine one more
        $data2 = $cache{key2};   # update data, call get_data_from_db
        $data3 = $cache{key3};   # update data, call get_data_from_file

        # If you have Time::HiRes package, that you can use float timeout
        $cache{key4} = {
            source  => \&get_data_from_db2,
            timeout => 0.5
        };

        # If you plane to change the returned data you may cloned there.
        # Set true to a flag "clone".
        $cache{key4} = {
            source  => \&get_data_from_db3,
            timeout => 1,
            clone   => 1
        };

DESCRIPTION

Sometimes I need show in web rarely changes data. You may save it in memory, but you never don't know how long script will be work. For example, fcgi scripts may work few days or weeks, but counters of database tables or site settings may changed more frequent in the day, each hour or each 10 minutes. I wrote package, that help you cached data on fixed time.

How to use

You may created hash and tied it usages this package.

        tie my %cache, 'Tie::Cache::Autoupdater';

And set it in hash

        $cache{db_query} = {
            timeout => 10,
            source  => sub { 
                my $sth = $DBH->prepare('select * from table'); 
                $sth->execute;
                return $sth->fetchall_arrayref
            }
        };

Package call anonymous subroutine when you want to get value from %cache with key db_query.

Or you may set cache parameters when you tied hash. Like this:

        tie %cache, 'Tie::Cache::Autoupdater', db_query => {
            timeout => 10,
            source  => sub { 
                my $sth = $DBH->prepare('select * from table'); 
                $sth->execute;
                return $sth->fetchall_arrayref
            }
        };

Parameters

You may set unlimited pairs key => value where key is unique cache key. Value is hash reference, where:

timeout

It's time for data saving. Default 1 second. If you have Time::HiRes module that you can set float timeout.

In next example value for key db_counters will be updated each 0.2 second, and value for file_count will be updated each 2.5 seconds.

        tie %cache, 'Tie::Cache::Autoupdater',
            db_counters => {
                timeout => 0.2,
                source  => sub { 
                    my $sth = $DBH->prepare('select count(*) from table2'); 
                    $sth->execute;
                    return ($sth->fetchrow_array);
                }
            },
            file_count => {
                timeout => 2.5,
                source  => sub {
                    my $file_count = glob( "$path/*" );
                    return $file_count;
                }
            };

source

Subroutine reference that return data for cache

clone

A flag that determines to clone or not clone the returned reference

NOTE1

If source subroutine return list, that package automatically convert it in array reference.

NOTE2

If system has Time::HiRes package that Tie::Cache::Autoupdater use Time::HiRes::time for timeout control.

NOTE3

For cloned references used dclone subroutine from Storage package

DEVELOPMENT

Repository

http://github.com/antonfin/Tie-Cache-Autoupdater

LICENSE AND COPYRIGHT

Copyright (c) 2011 (antonfin@cpan.org)

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.