改进缓存标签的设置和删除

This commit is contained in:
thinkphp
2016-08-17 19:07:29 +08:00
parent 684c04849a
commit 90fc917b00
9 changed files with 112 additions and 78 deletions

View File

@@ -80,6 +80,17 @@ abstract class Driver
*/ */
abstract public function clear($tag = null); abstract public function clear($tag = null);
/**
* 获取实际的缓存标识
* @access public
* @param string $name 缓存名
* @return string
*/
protected function getCacheKey($name)
{
return $this->options['prefix'] . $name;
}
/** /**
* 缓存标签 * 缓存标签
* @access public * @access public
@@ -96,6 +107,7 @@ abstract class Driver
if (is_string($keys)) { if (is_string($keys)) {
$keys = explode(',', $keys); $keys = explode(',', $keys);
} }
$keys = array_map([$this, 'getCacheKey'], $keys);
$value = array_unique(array_merge($this->getTagItem($name), $keys)); $value = array_unique(array_merge($this->getTagItem($name), $keys));
$this->set($key, implode(',', $value)); $this->set($key, implode(',', $value));
} }

View File

@@ -60,11 +60,11 @@ class File extends Driver
/** /**
* 取得变量的存储文件名 * 取得变量的存储文件名
* @access private * @access protected
* @param string $name 缓存变量名 * @param string $name 缓存变量名
* @return string * @return string
*/ */
private function filename($name) protected function getCacheKey($name)
{ {
$name = md5($name); $name = md5($name);
if ($this->options['cache_subdir']) { if ($this->options['cache_subdir']) {
@@ -90,7 +90,7 @@ class File extends Driver
*/ */
public function has($name) public function has($name)
{ {
$filename = $this->filename($name); $filename = $this->getCacheKey($name);
return is_file($filename); return is_file($filename);
} }
@@ -103,7 +103,7 @@ class File extends Driver
*/ */
public function get($name, $default = false) public function get($name, $default = false)
{ {
$filename = $this->filename($name); $filename = $this->getCacheKey($name);
if (!is_file($filename)) { if (!is_file($filename)) {
return $default; return $default;
} }
@@ -140,7 +140,7 @@ class File extends Driver
if (is_null($expire)) { if (is_null($expire)) {
$expire = $this->options['expire']; $expire = $this->options['expire'];
} }
$filename = $this->filename($name); $filename = $this->getCacheKey($name);
if ($this->tag && !is_file($filename)) { if ($this->tag && !is_file($filename)) {
$first = true; $first = true;
} }
@@ -202,7 +202,7 @@ class File extends Driver
*/ */
public function rm($name) public function rm($name)
{ {
return $this->unlink($this->filename($name)); return $this->unlink($this->getCacheKey($name));
} }
/** /**
@@ -219,6 +219,7 @@ class File extends Driver
foreach ($keys as $key) { foreach ($keys as $key) {
$this->unlink($key); $this->unlink($key);
} }
$this->rm('tag_' . md5($tag));
return true; return true;
} }
$fileLsit = (array) glob($this->options['path'] . '*'); $fileLsit = (array) glob($this->options['path'] . '*');

View File

@@ -44,11 +44,11 @@ class Lite extends Driver
/** /**
* 取得变量的存储文件名 * 取得变量的存储文件名
* @access private * @access protected
* @param string $name 缓存变量名 * @param string $name 缓存变量名
* @return string * @return string
*/ */
private function filename($name) protected function getCacheKey($name)
{ {
return $this->options['path'] . $this->options['prefix'] . md5($name) . '.php'; return $this->options['path'] . $this->options['prefix'] . md5($name) . '.php';
} }
@@ -61,7 +61,7 @@ class Lite extends Driver
*/ */
public function has($name) public function has($name)
{ {
$filename = $this->filename($name); $filename = $this->getCacheKey($name);
return is_file($filename); return is_file($filename);
} }
@@ -74,7 +74,7 @@ class Lite extends Driver
*/ */
public function get($name, $default = false) public function get($name, $default = false)
{ {
$filename = $this->filename($name); $filename = $this->getCacheKey($name);
if (is_file($filename)) { if (is_file($filename)) {
// 判断是否过期 // 判断是否过期
$mtime = filemtime($filename); $mtime = filemtime($filename);
@@ -106,7 +106,7 @@ class Lite extends Driver
if (0 === $expire) { if (0 === $expire) {
$expire = 10 * 365 * 24 * 3600; $expire = 10 * 365 * 24 * 3600;
} }
$filename = $this->filename($name); $filename = $this->getCacheKey($name);
if ($this->tag && !is_file($filename)) { if ($this->tag && !is_file($filename)) {
$first = true; $first = true;
} }
@@ -161,7 +161,7 @@ class Lite extends Driver
*/ */
public function rm($name) public function rm($name)
{ {
return unlink($this->filename($name)); return unlink($this->getCacheKey($name));
} }
/** /**
@@ -178,6 +178,7 @@ class Lite extends Driver
foreach ($keys as $key) { foreach ($keys as $key) {
unlink($key); unlink($key);
} }
$this->rm('tag_' . md5($tag));
return true; return true;
} }
array_map("unlink", glob($this->options['path'] . $this->options['prefix'] . '*.php')); array_map("unlink", glob($this->options['path'] . $this->options['prefix'] . '*.php'));

View File

@@ -64,8 +64,8 @@ class Memcache extends Driver
*/ */
public function has($name) public function has($name)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return $this->handler->get($name) ? true : false; return $this->handler->get($key) ? true : false;
} }
/** /**
@@ -77,7 +77,7 @@ class Memcache extends Driver
*/ */
public function get($name, $default = false) public function get($name, $default = false)
{ {
$result = $this->handler->get($this->options['prefix'] . $name); $result = $this->handler->get($this->getCacheKey($name));
return false !== $result ? $result : $default; return false !== $result ? $result : $default;
} }
@@ -97,9 +97,9 @@ class Memcache extends Driver
if ($this->tag && !$this->has($name)) { if ($this->tag && !$this->has($name)) {
$first = true; $first = true;
} }
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
if ($this->handler->set($name, $value, 0, $expire)) { if ($this->handler->set($key, $value, 0, $expire)) {
isset($first) && $this->setTagItem($name); isset($first) && $this->setTagItem($key);
return true; return true;
} }
return false; return false;
@@ -114,8 +114,8 @@ class Memcache extends Driver
*/ */
public function inc($name, $step = 1) public function inc($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return $this->handler->increment($name, $step); return $this->handler->increment($key, $step);
} }
/** /**
@@ -127,9 +127,9 @@ class Memcache extends Driver
*/ */
public function dec($name, $step = 1) public function dec($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
$value = $this->handler->get($name) - $step; $value = $this->handler->get($key) - $step;
$res = $this->handler->set($name, $value); $res = $this->handler->set($key, $value);
if (!$res) { if (!$res) {
return false; return false;
} else { } else {
@@ -145,10 +145,10 @@ class Memcache extends Driver
*/ */
public function rm($name, $ttl = false) public function rm($name, $ttl = false)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return false === $ttl ? return false === $ttl ?
$this->handler->delete($name) : $this->handler->delete($key) :
$this->handler->delete($name, $ttl); $this->handler->delete($key, $ttl);
} }
/** /**
@@ -165,6 +165,7 @@ class Memcache extends Driver
foreach ($keys as $key) { foreach ($keys as $key) {
$this->handler->delete($key); $this->handler->delete($key);
} }
$this->rm('tag_' . md5($tag));
return true; return true;
} }
return $this->handler->flush(); return $this->handler->flush();

View File

@@ -70,8 +70,8 @@ class Memcached extends Driver
*/ */
public function has($name) public function has($name)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return $this->handler->get($name) ? true : false; return $this->handler->get($key) ? true : false;
} }
/** /**
@@ -83,7 +83,7 @@ class Memcached extends Driver
*/ */
public function get($name, $default = false) public function get($name, $default = false)
{ {
$result = $this->handler->get($this->options['prefix'] . $name); $result = $this->handler->get($this->getCacheKey($name));
return false !== $result ? $result : $default; return false !== $result ? $result : $default;
} }
@@ -103,10 +103,10 @@ class Memcached extends Driver
if ($this->tag && !$this->has($name)) { if ($this->tag && !$this->has($name)) {
$first = true; $first = true;
} }
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
$expire = 0 == $expire ? 0 : $_SERVER['REQUEST_TIME'] + $expire; $expire = 0 == $expire ? 0 : $_SERVER['REQUEST_TIME'] + $expire;
if ($this->handler->set($name, $value, $expire)) { if ($this->handler->set($key, $value, $expire)) {
isset($first) && $this->setTagItem($name); isset($first) && $this->setTagItem($key);
return true; return true;
} }
return false; return false;
@@ -121,8 +121,8 @@ class Memcached extends Driver
*/ */
public function inc($name, $step = 1) public function inc($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return $this->handler->increment($name, $step); return $this->handler->increment($key, $step);
} }
/** /**
@@ -134,9 +134,9 @@ class Memcached extends Driver
*/ */
public function dec($name, $step = 1) public function dec($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
$value = $this->handler->get($name) - $step; $value = $this->handler->get($key) - $step;
$res = $this->handler->set($name, $value); $res = $this->handler->set($key, $value);
if (!$res) { if (!$res) {
return false; return false;
} else { } else {
@@ -152,10 +152,10 @@ class Memcached extends Driver
*/ */
public function rm($name, $ttl = false) public function rm($name, $ttl = false)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return false === $ttl ? return false === $ttl ?
$this->handler->delete($name) : $this->handler->delete($key) :
$this->handler->delete($name, $ttl); $this->handler->delete($key, $ttl);
} }
/** /**
@@ -170,6 +170,7 @@ class Memcached extends Driver
// 指定标签清除 // 指定标签清除
$keys = $this->getTagItem($tag); $keys = $this->getTagItem($tag);
$this->handler->deleteMulti($keys); $this->handler->deleteMulti($keys);
$this->rm('tag_' . md5($tag));
return true; return true;
} }
return $this->handler->flush(); return $this->handler->flush();

View File

@@ -63,7 +63,7 @@ class Redis extends Driver
*/ */
public function has($name) public function has($name)
{ {
return $this->handler->get($this->options['prefix'] . $name) ? true : false; return $this->handler->get($this->getCacheKey($name)) ? true : false;
} }
/** /**
@@ -75,7 +75,7 @@ class Redis extends Driver
*/ */
public function get($name, $default = false) public function get($name, $default = false)
{ {
$value = $this->handler->get($this->options['prefix'] . $name); $value = $this->handler->get($this->getCacheKey($name));
if (is_null($value)) { if (is_null($value)) {
return $default; return $default;
} }
@@ -97,14 +97,18 @@ class Redis extends Driver
if (is_null($expire)) { if (is_null($expire)) {
$expire = $this->options['expire']; $expire = $this->options['expire'];
} }
$name = $this->options['prefix'] . $name; if ($this->tag && !$this->has($name)) {
$first = true;
}
$key = $this->getCacheKey($name);
//对数组/对象数据进行缓存处理,保证数据完整性 byron sampson<xiaobo.sun@qq.com> //对数组/对象数据进行缓存处理,保证数据完整性 byron sampson<xiaobo.sun@qq.com>
$value = (is_object($value) || is_array($value)) ? json_encode($value) : $value; $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value;
if (is_int($expire) && $expire) { if (is_int($expire) && $expire) {
$result = $this->handler->setex($name, $expire, $value); $result = $this->handler->setex($key, $expire, $value);
} else { } else {
$result = $this->handler->set($name, $value); $result = $this->handler->set($key, $value);
} }
isset($first) && $this->setTagItem($key);
return $result; return $result;
} }
@@ -117,8 +121,8 @@ class Redis extends Driver
*/ */
public function inc($name, $step = 1) public function inc($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return $this->handler->incrby($name, $step); return $this->handler->incrby($key, $step);
} }
/** /**
@@ -130,8 +134,8 @@ class Redis extends Driver
*/ */
public function dec($name, $step = 1) public function dec($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return $this->handler->decrby($name, $step); return $this->handler->decrby($key, $step);
} }
/** /**
@@ -142,7 +146,7 @@ class Redis extends Driver
*/ */
public function rm($name) public function rm($name)
{ {
return $this->handler->delete($this->options['prefix'] . $name); return $this->handler->delete($this->getCacheKey($name));
} }
/** /**
@@ -159,6 +163,7 @@ class Redis extends Driver
foreach ($keys as $key) { foreach ($keys as $key) {
$this->handler->delete($key); $this->handler->delete($key);
} }
$this->rm('tag_' . md5($tag));
return true; return true;
} }
return $this->handler->flushDB(); return $this->handler->flushDB();

View File

@@ -47,6 +47,17 @@ class Sqlite extends Driver
$this->handler = $func($this->options['db']); $this->handler = $func($this->options['db']);
} }
/**
* 获取实际的缓存标识
* @access public
* @param string $name 缓存名
* @return string
*/
protected function getCacheKey($name)
{
return $this->options['prefix'] . sqlite_escape_string($name);
}
/** /**
* 判断缓存 * 判断缓存
* @access public * @access public
@@ -55,7 +66,7 @@ class Sqlite extends Driver
*/ */
public function has($name) public function has($name)
{ {
$name = $this->options['prefix'] . sqlite_escape_string($name); $name = $this->getCacheKey($name);
$sql = 'SELECT value FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\' AND (expire=0 OR expire >' . $_SERVER['REQUEST_TIME'] . ') LIMIT 1'; $sql = 'SELECT value FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\' AND (expire=0 OR expire >' . $_SERVER['REQUEST_TIME'] . ') LIMIT 1';
$result = sqlite_query($this->handler, $sql); $result = sqlite_query($this->handler, $sql);
return sqlite_num_rows($result); return sqlite_num_rows($result);
@@ -70,7 +81,7 @@ class Sqlite extends Driver
*/ */
public function get($name, $default = false) public function get($name, $default = false)
{ {
$name = $this->options['prefix'] . sqlite_escape_string($name); $name = $this->getCacheKey($name);
$sql = 'SELECT value FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\' AND (expire=0 OR expire >' . $_SERVER['REQUEST_TIME'] . ') LIMIT 1'; $sql = 'SELECT value FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\' AND (expire=0 OR expire >' . $_SERVER['REQUEST_TIME'] . ') LIMIT 1';
$result = sqlite_query($this->handler, $sql); $result = sqlite_query($this->handler, $sql);
if (sqlite_num_rows($result)) { if (sqlite_num_rows($result)) {
@@ -94,7 +105,7 @@ class Sqlite extends Driver
*/ */
public function set($name, $value, $expire = null) public function set($name, $value, $expire = null)
{ {
$name = $this->options['prefix'] . sqlite_escape_string($name); $name = $this->getCacheKey($name);
$value = sqlite_escape_string(serialize($value)); $value = sqlite_escape_string(serialize($value));
if (is_null($expire)) { if (is_null($expire)) {
$expire = $this->options['expire']; $expire = $this->options['expire'];
@@ -159,7 +170,7 @@ class Sqlite extends Driver
*/ */
public function rm($name) public function rm($name)
{ {
$name = $this->options['prefix'] . sqlite_escape_string($name); $name = $this->getCacheKey($name);
$sql = 'DELETE FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\''; $sql = 'DELETE FROM ' . $this->options['table'] . ' WHERE var=\'' . $name . '\'';
sqlite_query($this->handler, $sql); sqlite_query($this->handler, $sql);
return true; return true;

View File

@@ -51,8 +51,8 @@ class Wincache extends Driver
*/ */
public function has($name) public function has($name)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return wincache_ucache_exists($name); return wincache_ucache_exists($key);
} }
/** /**
@@ -64,8 +64,8 @@ class Wincache extends Driver
*/ */
public function get($name, $default = false) public function get($name, $default = false)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return wincache_ucache_exists($name) ? wincache_ucache_get($name) : $default; return wincache_ucache_exists($key) ? wincache_ucache_get($key) : $default;
} }
/** /**
@@ -81,12 +81,12 @@ class Wincache extends Driver
if (is_null($expire)) { if (is_null($expire)) {
$expire = $this->options['expire']; $expire = $this->options['expire'];
} }
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
if ($this->tag && !$this->has($name)) { if ($this->tag && !$this->has($name)) {
$first = true; $first = true;
} }
if (wincache_ucache_set($name, $value, $expire)) { if (wincache_ucache_set($key, $value, $expire)) {
isset($first) && $this->setTagItem($name); isset($first) && $this->setTagItem($key);
return true; return true;
} }
return false; return false;
@@ -101,8 +101,8 @@ class Wincache extends Driver
*/ */
public function inc($name, $step = 1) public function inc($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return wincache_ucache_inc($name, $step); return wincache_ucache_inc($key, $step);
} }
/** /**
@@ -114,8 +114,8 @@ class Wincache extends Driver
*/ */
public function dec($name, $step = 1) public function dec($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return wincache_ucache_dec($name, $step); return wincache_ucache_dec($key, $step);
} }
/** /**
@@ -126,7 +126,7 @@ class Wincache extends Driver
*/ */
public function rm($name) public function rm($name)
{ {
return wincache_ucache_delete($this->options['prefix'] . $name); return wincache_ucache_delete($this->getCacheKey($name));
} }
/** /**
@@ -142,6 +142,7 @@ class Wincache extends Driver
foreach ($keys as $key) { foreach ($keys as $key) {
wincache_ucache_delete($key); wincache_ucache_delete($key);
} }
$this->rm('tag_' . md5($tag));
return true; return true;
} else { } else {
return wincache_ucache_clear(); return wincache_ucache_clear();

View File

@@ -49,8 +49,8 @@ class Xcache extends Driver
*/ */
public function has($name) public function has($name)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return xcache_isset($name); return xcache_isset($key);
} }
/** /**
@@ -62,8 +62,8 @@ class Xcache extends Driver
*/ */
public function get($name, $default = false) public function get($name, $default = false)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return xcache_isset($name) ? xcache_get($name) : $default; return xcache_isset($key) ? xcache_get($key) : $default;
} }
/** /**
@@ -82,9 +82,9 @@ class Xcache extends Driver
if ($this->tag && !$this->has($name)) { if ($this->tag && !$this->has($name)) {
$first = true; $first = true;
} }
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
if (xcache_set($name, $value, $expire)) { if (xcache_set($key, $value, $expire)) {
isset($first) && $this->setTagItem($name); isset($first) && $this->setTagItem($key);
return true; return true;
} }
return false; return false;
@@ -99,8 +99,8 @@ class Xcache extends Driver
*/ */
public function inc($name, $step = 1) public function inc($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return xcache_inc($name, $step); return xcache_inc($key, $step);
} }
/** /**
@@ -112,8 +112,8 @@ class Xcache extends Driver
*/ */
public function dec($name, $step = 1) public function dec($name, $step = 1)
{ {
$name = $this->options['prefix'] . $name; $key = $this->getCacheKey($name);
return xcache_dec($name, $step); return xcache_dec($key, $step);
} }
/** /**
@@ -124,7 +124,7 @@ class Xcache extends Driver
*/ */
public function rm($name) public function rm($name)
{ {
return xcache_unset($this->options['prefix'] . $name); return xcache_unset($this->getCacheKey($name));
} }
/** /**
@@ -141,6 +141,7 @@ class Xcache extends Driver
foreach ($keys as $key) { foreach ($keys as $key) {
xcache_unset($key); xcache_unset($key);
} }
$this->rm('tag_' . md5($tag));
return true; return true;
} }
if (function_exists('xcache_unset_by_prefix')) { if (function_exists('xcache_unset_by_prefix')) {