Closed MCStreetguy closed 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');
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.