Support implicit sectioned caching using :: syntax.

This commit is contained in:
Taylor Otwell 2012-04-28 22:40:11 -05:00
parent 4d2ecdbff2
commit 31106a9211
1 changed files with 69 additions and 4 deletions

View File

@ -16,6 +16,20 @@ class Memcached extends Driver implements Sectionable {
*/ */
protected $key; protected $key;
/**
* Indicates that section caching is implicit based on keys.
*
* @var bool
*/
public $implicit = true;
/**
* The implicit section key delimiter.
*
* @var string
*/
public $delimiter = '::';
/** /**
* Create a new Memcached cache driver instance. * Create a new Memcached cache driver instance.
* *
@ -47,7 +61,13 @@ public function has($key)
*/ */
protected function retrieve($key) protected function retrieve($key)
{ {
if (($cache = $this->memcache->get($this->key.$key)) !== false) if ($this->sectionable($key))
{
list($section, $key) = $this->parse($key);
return $this->get_from_section($section, $key);
}
elseif (($cache = $this->memcache->get($this->key.$key)) !== false)
{ {
return $cache; return $cache;
} }
@ -81,7 +101,16 @@ public function get_from_section($section, $key, $default = null)
*/ */
public function put($key, $value, $minutes) public function put($key, $value, $minutes)
{ {
$this->memcache->set($this->key.$key, $value, $minutes * 60); if ($this->sectionable($key))
{
list($section, $key) = $this->parse($key);
return $this->put_in_section($section, $key, $value, $minutes);
}
else
{
$this->memcache->set($this->key.$key, $value, $minutes * 60);
}
} }
/** /**
@ -107,7 +136,16 @@ public function put_in_section($section, $key, $value, $minutes)
*/ */
public function forever($key, $value) public function forever($key, $value)
{ {
return $this->put($key, $value, 0); if ($this->sectionable($key))
{
list($section, $key) = $this->parse($key);
return $this->forever_in_section($section, $key, $value);
}
else
{
return $this->put($key, $value, 0);
}
} }
/** /**
@ -160,7 +198,23 @@ public function sear_in_section($section, $key, $default)
*/ */
public function forget($key) public function forget($key)
{ {
$this->memcache->delete($this->key.$key); if ($this->sectionable($key))
{
list($section, $key) = $this->parse($key);
if ($key == '*')
{
$this->forget_section($section);
}
else
{
$this->forget_in_section($section, $key);
}
}
else
{
$this->memcache->delete($this->key.$key);
}
} }
/** /**
@ -223,6 +277,17 @@ protected function section_item_key($section, $key)
return $section.'#'.$this->section_id($section).'#'.$key; return $section.'#'.$this->section_id($section).'#'.$key;
} }
/**
* Indicates if a key is sectionable.
*
* @param string $key
* @return bool
*/
protected function sectionable($key)
{
return $this->implicit and $this->sectioned($key);
}
/** /**
* Determine if a key is sectioned. * Determine if a key is sectioned.
* *