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) = @_;
        # ...
      });

