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