2009-09-04 68 views
5

我想知道是否有像Memcached,velocity或sharedcache這樣的分佈式緩存系統,它允許我用比它更多的名稱來標記內容,或者可以將項目與eachother關聯起來,所以如果我使緩存一個無效項目也會使相關項目無效。允許標記內容的任何分佈式緩存系統?

例如。如果我有兩個引用相同數據和數據更改的頁面,我希望兩個引用頁面的緩存無效。

  • 或者是這是一個乞求開發的項目之一? :)

編輯:我在asp.net

+0

我也會對此感興趣 - 好問題。 – 2009-09-04 10:44:11

回答

0

Velocity支持標記,每個標記是一個字符串。對象可以通過標籤或多個標籤來檢索,例如'調味品'和'免費送貨'。

然而Velocity不支持依賴--Volocity團隊的IIRC表示依賴不會在v1中。

+1

也許我會研究速度,但是我的膽量告訴我,memcache是​​要走的路:) – possan 2009-09-07 12:54:33

+0

我會將此標記爲解決方案。 – possan 2009-09-07 12:56:35

3

我相信相關的數據的刪除可以使用的memcached的CAS(檢查和設置)操作來完成。每個值都有一個唯一的ID(串行)。對於每個密鑰,存儲另一個key.dependents,其中包含數據序列以及所有依賴項的密鑰。

如果要添加一個依賴,做

dependents, dep_serial = fetch(key+".dependents") 
data, serial = fetch(key) 
if serial != dependents[0]: 
    # somebody changed the actual data 
    start_over 
generate_and_cache_dependent(dep_key, data) 
dependents.append(dep_key) 
if not cas(dependents, dep_serial): 
    # somebody changed dependents 
    start_over # can avoid regenerating the data if they are still at serial 

當無效的項目,做

dependents, dep_serial = fetch(key + ".dependents") 
serial = update(key, new_data) 
for dkey in dependents[1:]: 
    delete(dkey) 
dependents = [serial] 
if not cas(dependents, dep_serial): 
    start_over 

即使在衝突的寫入的情況下,這些算法最終會終止,因爲一個作家會總是「通過」。

+0

有趣,我會研究一下! 但我真的想把它包裝成類似 集('節#1','節數據','文章#1,文章#2,文章#3') 然後只是beeing能夠刪除('第1條');然後當我嘗試獲取section1時,它只需要重新生成它,但這可能會造成競爭條件和緩存死鎖,而這些也不是很有趣:/ – possan 2009-09-04 11:59:21