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

2021-08-25 01:33:55 字數 4737 閱讀 5225

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 快取應用問題

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