Memcached的是一个伟大的可扩展缓存层但它有一个很大的问题(我)它不能管理标签。标签对组合失效非常有用。的Memcache标签仿真
我已经做了一些研究,我所知道的一些解决方案:(REF Best way to invalidate a number of memcache keys using standard php libraries?)
- 的Memcache标签叉http://code.google.com/p/memcached-tag/
- 代码执行效仿标签
我的一个最喜欢的解决方案是名称空间,此解决方案在memcached wiki上进行了解释。
但是我不明白为什么我们要将命名空间集成到键缓存上?
从我理解关于命名空间的诀窍是:要生成密钥,我们必须获取命名空间的值(在缓存上)。如果namespace->value
缓存条目被逐出,我们不能再计算获取缓存的好钥匙......所以这个命名空间的缓存实际上是 invalidate(我之所以这么说,是因为缓存依然存在,但我们不能再计算关键访问)。
那么,为什么我们不能简单地实现这样的:
tag1->[key1, key2, key5]
tag2->[key1, key3, key6]
key1->["value" => value1, "tags" => [tag1, tag2]]
key2->["value" => value2, "tags" => [tag1]]
key3->["value" => value3, "tags" => [tag3]]
etc...
有了这个实现我回来的问题,如果tag1->[key1, key2, key5]
被逐出我们没有更多的无效标记1键。但随着
function load($cacheId) {
$cache = $memcache->get($cacheId);
if (is_array($cache)) {
$evicted = false;
// Check is no tags have been evicted
foreach ($cache["tags"] as $tagId) {
if (!$memcache->get($tagId) {
$evicted = true;
break;
}
}
// If no tags have been evicted we can return cache
if (!$evicted) {
return $cache
} else {
// Not mandatory
$memcache->delete($cacheId);
}
// Else return false
return false;
}
}
这是伪代码
我们一定会返回高速缓存,如果这一切标签可用。
首先我们可以说它是“每次你需要缓存,我们必须检查(/ get)X标签,然后检查数组”。但是对于命名空间,我们还必须检查(/ get)命名空间以检索命名空间值,主要差异是在数组之下迭代...但是我不认为键会有很多标记(我无法想象超过10个标记/关键是我的应用程序),所以重复在大小10阵列这是相当速度..
所以我的问题是:有人已经想过这个实现?什么是极限?我忘了什么吗?等
或者,也许我有missunderstand命名空间的概念...
PS:我不是在寻找另一个缓存层像memcached的标签或Redis的
何是啊,我也没多想这个问题!是的,我已经想过可靠的标签缓存后端,我想我会使用它 – Kakawait
什么是您可靠的后端? RDBM像Redis一样是MySQL还是NoSQL?如果MySQL是什么你的存储引擎? – Kakawait
我做的事情非常相似。我有一个非常简单的mysql cache_keys表。它有两列,'keyname'和'expires'。任何时候我将某些内容保存到memcached中,我还会对cache_keys表进行插入/更新以记录密钥。我不记录所有缓存键,只是我知道我需要能够手动清除。然后,我使用一个php脚本对数据库执行通配符查询,以查找具有给定前缀的键,并将它们从memcached和db中删除。我也可以通过这种方式清除过期的密钥。它可以工作,但清除缓存会破坏MySQL。当我们有300个同时在线的用户时,工作得很好,800+以上的用户不太好。 – minorgod