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