Companies House

NAME

MojoX::Plugin::AnyCache - Cache plugin with blocking and non-blocking support

SYNOPSIS

  $app->plugin('MojoX::Plugin::AnyCache' => {
    backend => 'MojoX::Plugin::AnyCache::Backend::Redis',
    server => '127.0.0.1:6379',
  });

  # For synchronous backends (blocking)
  $app->cache->set('key', 'value');
  my $value = $app->cache->get('key');

  # For asynchronous backends (non-blocking)
  $app->cache->set('key', 'value' => sub {
    # ...
  });
  $app->cache->get('key' => sub {
    my $value = shift;
    # ...
  });

DESCRIPTION

MojoX::Plugin::AnyCache provides an interface to both blocking and non-blocking caching backends, for example Redis or Memcached.

It also has a built-in replicator backend (MojoX::Plugin::AnyCache::Backend::Replicator) which automatically replicates values across multiple backend cache nodes.

SERIALISATION

The cache backend module supports an optional serialiser module.

  $app->plugin('MojoX::Plugin::AnyCache' => {
    backend => 'MojoX::Plugin::AnyCache::Backend::Redis',
    server => '127.0.0.1:6379',
    serialiser => 'MojoX::Plugin::AnyCache::Serialiser::MessagePack'
  });

SERIALISER WARNING

If you use a serialiser, incr or decr a value, then retrieve the value using get, the value returned is deserialised.

With the FakeSerialiser used in tests, this means 1 is translated to an A.

This 'bug' can be avoided by reading the value from the cache backend directly, bypassing the backend serialiser:

  $self->cache->set('foo', 1);
  $self->cache->backend->get('foo');

TTL / EXPIRES

Redis

Full TTL support is available with a Redis backend. Pass the TTL (in seconds) to the set method.

  $cache->set("key", "value", 10);

  $cache->set("key", "value", 10, sub {
    # ...
  });

And to get the TTL (seconds remaining until expiry)

  my $ttl = $cache->ttl("key");

  $cache->ttl("key", sub {
    my ($ttl) = @_;
    # ...
  });

Memcached

Full TTL set support is available with a Memcached backend. Pass the TTL (in seconds) to the set method.

  $cache->set("key", "value", 10);

  $cache->set("key", "value", 10, sub {
    # ...
  });

Unlike a Redis backend, 'get' TTL mode in Memcached is emulated, and the time remaining is calculated using timestamps, and stored in a separate prefixed key.

To enable this, set get_ttl_support on the backend:

  $cache->backend->get_ttl_support(1);

This must be done before setting a value. You can then get the TTL as normal:

  my $ttl = $cache->ttl("key");

  $cache->ttl("key", sub {
    my ($ttl) = @_;
    # ...
  });