cachedependency
我們知道在system.web.caching.cache中有快取依賴這麼個概念。涉及到的類有cachedependency和 sqlcachedependency。
cachedependency建構函式:
static
cachedependency();
protected
cachedependency();
private
cachedependency(
intbogus);
public
cachedependency(
string
filename);
public
cachedependency(
string
filenames);
internal
cachedependency(
intdummy,
string
filename);
public
cachedependency(
string
filenames,datetimestart);
public
cachedependency(
string
filenames,
string
cachekeys);
internal
cachedependency(
intdummy,
string
filenames);
public
cachedependency(
string
filename,datetimestart);
public
cachedependency(
string
filenames,
string
cachekeys,datetimestart);
public
cachedependency(
string
filenames,
string
cachekeys,cachedependencydependency);
internal
cachedependency(
intdummy,
string
filename,datetimeutcstart);
internal
cachedependency(
intdummy,
string
filenames,
string
cachekeys);
internal
cachedependency(
intdummy,
string
filenames,datetimeutcstart);
public
cachedependency(
string
filenames,
string
cachekeys,cachedependencydependency,datetimestart);
internal
cachedependency(
intdummy,
string
filenames,
string
cachekeys,datetimeutcstart);
internal
cachedependency(
intdummy,
string
filenames,
string
cachekeys,cachedependencydependency);
internal
cachedependency(
intdummy,
string
filenames,
string
cachekeys,cachedependencydependency,datetimeutcstart);
sqlcachedependency建構函式:
private
sqlcachedependency();
public
sqlcachedependency(sqlcommandsqlcmd);
public
sqlcachedependency(
string
databaseentryname,
string
tablename);
從上面的建構函式可以看出依賴項可以是:
filenames:
快取物件所依賴的一組 (到檔案或目錄的)路徑。當這些資源中的任何乙個更改時,快取的物件即過時,並從快取中移除。
cachekeys:
一組快取鍵,新物件監視它們的更改。當這些快取鍵中的任何乙個發生更改 時,與此依賴項物件關聯的快取物件即過時,並從快取中移除。
tablename : 表名。
初步設想
我想實現的功能是memcached中某乙個key基於另乙個key 的依賴。
據我所知memcached的cache機制是這樣的:lru(最近最少用)演算法+超時失效,其本身沒有提供依賴策略。
下面談一下我的設計思路:
場景:key2,key3依賴於key1。當key1發生變化時,key2,key3視為無效。
第乙個思路:key1發生變化時,不立即移除 key2,key3。在每次返回key2,key3物件時檢查key1是否發生變化。如果發生變化再移除key2,key3。
按著這個思路,設計了以下模型圖。歡迎拍磚!
解釋一下上圖:
沒有依賴項的ca
chedata:資料cache。
ctime:建立時間 cache。
建立key1時,建立data_key1和time_key1。
移除key1時,移除data_key1和 time_key1。
有依賴項的cache
data: 資料cache。
ctime:建立時間cache。
dependkey:所依賴的key。
dependctime:所依賴的 key的建立時間。
建立key2時,建立data_key2、time_key2、depdata_key2和 deptime_key2。
depdata_key2的值是data_key1。
deptime_key2的值是time_key1的 值。
讀取key2
1、判斷deptime_key2的值是否等於time_key1的值。
2、如果相等,直接讀取 data_key2。
3、如果不等,移除data_key2、time_key2、depdata_key2和deptime_key2。
if(time_value1==deptime_value2)
else
第二個思路:
key1發生變化時,立即移除key2,key3。
1 、依賴關係儲存在memcached中(記憶體)。
沒有依賴項的cache
data:資料 cache。
dependkey:依賴於key1的key集合。
建立key1時,建立data_key1。
移除key1 時,移除data_key1、data_key2和 depdata_key1。
有依賴項的 cache
data:資料cache。
建立key2時,建立data_key2、更新depdata_key1。
移 除key2時,移除data_key2、更新depdata_key1。
2、依賴關係儲存在xml檔案中(硬碟)。
原理與上面類似,只是將dependkey儲存到了xml結構中。
memcached中的超時失效
我們上面的設計都是在客戶端封裝的方法(addcache、removecache),memcached中有超時失效。下面看看超時失效對於以上 設計的影響。
第乙個思路
1、key1超時失效。
key1的data、ctime失效時間設為一致。
key1的data_key1和time_key1失效後,當讀取key2時,time_value1=null。key2會做remove操作。 該設計方案不受影響。
2、key2超時失效。
key2的data_key2、time_key2、depdata_key2和deptime_key2 失效時間設為一致。
key2失效後對key1沒有影響。
第二個思路
1、key1超時失效。
key1的data、dependkey失效時間設為一致。
key1的data、dependkey失效後,key2沒有被移除,會造成key2數 據不一致。 如果memcached超時失效時有通知的機制就可以解決此問題。
目前沒有查到memcached中有超時失效通知的機制。
2、 key2超時失效。key2失效後,depdata_key1中還存在key2。下次key1失效時,會多一次判斷。不過功能不受影響。
為memcached增加快取依賴的程式實現
節前的一篇文章中提出了 為memcached增加快取依賴的初步設想,本文對第乙個思路進行實現。實現思路 key1發生變化時,不立即移除 key2,key3。在每次返回key2,key3物件時檢查key1是否發生變化。如果發生變化再移除key2,key3。為了方便閱讀,再把上文中的圖貼出來。參考程式 ...
Memcached 快取體系
關於memcached的博文太多了,以下是個人學習的收集整理。本節討論問題 一 介紹與應用 關於memcached以下為摘自博文 客戶端的版本比較多,並且不能互用,因為採用了壓縮機制,日誌等功能,所以在選擇客戶端時要注意這些。a.windows下 直接使用memcached.exe 程式就可以了,也...
memcached 快取應用問題
快取穿透與快取雪崩 快取系統不得不考慮的另乙個問題是快取穿透與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿...