為memcached增加快取依賴的程式實現

2021-09-05 22:53:02 字數 4683 閱讀 1015

節前的一篇文章中提出了

為memcached增加快取依賴的初步設想,本文對第乙個思路進行實現。

實現思路

key1發生變化時,不立即移除 key2,key3。在每次返回key2,key3物件時檢查key1是否發生變化。如果發生變化再移除key2,key3。

為了方便閱讀,再把上文中的圖貼出來。

參考程式

discuznt:

cachekey

s 參照上圖,首先將四個快取域的key字首定義下來。

public

class

cachekeys

memcachedependency

在asp.net中有乙個cachedependency類,我建立了乙個簡化版的memcachedependency,並繼承自介面icachedependency。同時用乙個列舉型別的enumdependtype表示快取依賴型別,目前只實現了快取之間的鍵依賴。

public

inte***ce

icachedependency

enumdependtype dependtype 

}///

///快取依賴型別

///

public

enum

enumdependtype

memcachedependency的實現也非常簡單,就是初始化dependkey和dependtype。

public

class

memcachedependency:icachedependency

public

enumdependtype dependtype 

//////

初始化///

///快取依賴項key

public

memcachedependency(

string

dependkey)}

memcachedstrategy

上面引入了memcachedependency,建立cache時增加了以下方法。

void addobjectwithdepend(string objid, object o, icachedependency dep);

先修改策略介面

//////

公共快取策略介面

///

public

inte***ce

icachestrategy}

介面中,新增了乙個方法retrievecache,他和retrieveobject的不同:

retrieveobject

objid:建立cache時的key,如:上圖中的key1,key2,key3。返回data_key1,data_key2,data_key3的value。

retrievecache

objid:cache中實際存在的key,如:ctime_key1,depend_key1等。返回對應的value。

下面是memcachedstrategy的實現:

//////

memcache快取策略類 

///

public

class

memcachedstrategy : lee.cache.icachestrategy

#region

操作指定key的cache

private

void

addcache(

string

objid, 

object

o)private

void

removecache(

string

objid)

private

bool

keyexists(

string

objid)

public

object

retrievecache(

string

objid)

#endregion

//////

新增指定id的cache 沒有依賴項

///

///

///

public

void

addobject(

string

objid, 

object

o)///

///新增指定id的cache 有依賴項 

///

///

///

///依賴項key,目前只支援設定乙個依賴key

public

void

addobjectwithdepend(

string

objid, 

object

o, string

dependkey)

else}}

//////

新增指定id的cache 有依賴項

///

///

///

///icachedependency

public

void

addobjectwithdepend(

string

objid, 

object

o, icachedependency dep)

else}}

//////

移除指定id的物件

///

///

public

void

removeobject(

string

objid)

//////

返回指定id的物件,並根據快取依賴做失效操作 

///

///

///

public

object

retrieveobject(

string

objid)

else

else

}return

obj;

}public

void

addobjectwithfilechange(

string

objid, 

object

o, string

files)}

其中的addobject、addobjectwithdepend、removeobject和retrieveobject方法可以參照實現思路進行理解。更詳細介紹請參考為 memcached增加快取依賴的初步設想。

cachecontext

下面是對cachecontext的改造,同樣增加了包含icachedependency型別引數的addobject方法。

//////

快取進行全域性控制管理

///

public

class

cachecontext

}///

///單體模式返回當前類的例項

///

///

public

static

cachecontext getcacheservice()}}

return

instance;

}public

virtual

void

addobject(

string

objectid, 

objecto)}

public

virtual

void

addobject(

string

objectid, 

object

o,string

keys)

}public

virtual

void

addobject(

string

objectid, 

object

o,icachedependency dep)

}public

virtual

object

getobject(

string

objid)

catch

}public

virtual

object

getcache(

string

objid)

catch

}public

virtual

void

removeobject(

string

objid)

}///

///載入指定的快取策略

///

///

public

void

loadcachestrategy(icachestrategy ics)}}

//////

載入預設的快取策略

///

public

void

loaddefaultcachestrategy()

else}}

}策略模式

為 memcached增加快取依賴的初步設想

cachedependency 我們知道在system.web.caching.cache中有快取依賴這麼個概念。涉及到的類有cachedependency和 sqlcachedependency。cachedependency建構函式 static cachedependency protecte...

Memcached 快取體系

關於memcached的博文太多了,以下是個人學習的收集整理。本節討論問題 一 介紹與應用 關於memcached以下為摘自博文 客戶端的版本比較多,並且不能互用,因為採用了壓縮機制,日誌等功能,所以在選擇客戶端時要注意這些。a.windows下 直接使用memcached.exe 程式就可以了,也...

memcached 快取應用問題

快取穿透與快取雪崩 快取系統不得不考慮的另乙個問題是快取穿透與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿...