matthiasmullie / scrapbook

PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APC(u), SQL and additional capabilities (e.g. transactions, stampede protection) built on top.
https://www.scrapbook.cash
MIT License
315 stars 27 forks source link

(Request) Setting a default TTL value #36

Closed MCStreetguy closed 6 years ago

MCStreetguy commented 6 years ago

It would be a really nice feature if you could override the standard TTL value for any adapter. Because my TTLs are static across my whole application it's not very comfortable to always provide them in the method calls, but leaving them out results in an infinite TTL due to implementation.

matthiasmullie commented 6 years ago

Hey @MCStreetguy

I'm not yet entirely convinced this belongs in the library - I'll give it some thought.

However, one of the things I really like about the Scrapbook architecture, is that you can just create another class that wraps over the rest, like how most of the features are currently implemented.

You could simply create another class that will relay all function calls to the actual storage, but falls back to some default expiration value. Something like this (untested, might contain syntax errors):

class DefaultExpiration implements \MatthiasMullie\Scrapbook\KeyValueStore
{
    /**
     * @var KeyValueStore
     */
    protected $cache;

    /**
     * @var int
     */
    protected $defaultExpire = 0;

    /**
     * @param KeyValueStore $cache
     * @param int $defaultExpire
     */
    public function __construct(KeyValueStore $cache, $defaultExpire)
    {
        $this->cache = $cache;
        $this->defaultExpire = $defaultExpire;
    }

    /**
     * {@inheritdoc}
     */
    public function get($key, &$token = null)
    {
        return $this->cache->get($key, $token);
    }

    /**
     * {@inheritdoc}
     */
    public function getMulti(array $keys, array &$tokens = null)
    {
        return $this->cache->getMulti($keys, $tokens);
    }

    /**
     * {@inheritdoc}
     */
    public function set($key, $value, $expire = 0)
    {
        return $this->cache->set($key, $value, $expire ?: $this->defaultExpire);
    }

    /**
     * {@inheritdoc}
     */
    public function setMulti(array $items, $expire = 0)
    {
        return $this->cache->setMulti($items, $expire ?: $this->defaultExpire);
    }

    /**
     * {@inheritdoc}
     */
    public function delete($key)
    {
        return $this->cache->delete($key);
    }

    /**
     * {@inheritdoc}
     */
    public function deleteMulti(array $keys)
    {
        return $this->cache->deleteMulti($keys);
    }

    /**
     * {@inheritdoc}
     */
    public function add($key, $value, $expire = 0)
    {
        return $this->cache->add($key, $value, $expire ?: $this->defaultExpire);
    }

    /**
     * {@inheritdoc}
     */
    public function replace($key, $value, $expire = 0)
    {
        return $this->cache->replace($key, $value, $expire ?: $this->defaultExpire);
    }

    /**
     * {@inheritdoc}
     */
    public function cas($token, $key, $value, $expire = 0)
    {
        return $this->cache->cas($token, $key, $value, $expire ?: $this->defaultExpire);
    }

    /**
     * {@inheritdoc}
     */
    public function increment($key, $offset = 1, $initial = 0, $expire = 0)
    {
        return $this->cache->increment($key, $offset, $initial, $expire ?: $this->defaultExpire);
    }

    /**
     * {@inheritdoc}
     */
    public function decrement($key, $offset = 1, $initial = 0, $expire = 0)
    {
        return $this->cache->decrement($key, $offset, $initial, $expire ?: $this->defaultExpire);
    }

    /**
     * {@inheritdoc}
     */
    public function touch($key, $expire)
    {
        return $this->cache->touch($key, $expire ?: $this->defaultExpire);
    }

    /**
     * {@inheritdoc}
     */
    public function flush()
    {
        return $this->cache->flush();
    }

    /**
     * {@inheritdoc}
     */
    public function getCollection($name)
    {
        return $this->cache->getCollection($name);
    }
}

You would then use it like this:

// create \Memcached object pointing to your Memcached server
$client = new \Memcached();
$client->addServer('localhost', 11211);
// create Scrapbook cache object
$cache = new \MatthiasMullie\Scrapbook\Adapters\Memcached($client);
// add default TTL layer on top - default to TTL of 1 day
$cache = new DefaultExpiration($cache, 24 * 60 * 60);

// store something for half an hour
$cache->set('key', 'value', 30 * 60);
// store something without TTL (defaults to 1 day)
$cache->set('key', 'value');