巧用lock解決快取擊穿的解決方案

2021-10-18 16:45:23 字數 1623 閱讀 9640

快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。

1、設定熱點資料永遠不過期。

2.1、根據key生成object()

private static object getmemorycachelockobject(string key));}

return lockobject;

}}

2.2、lock住getmemorycachelockobject(key)

public t get(string key, funcgetdatawork, timespan absoluteexpiretime, bool forcerefresh = false, bool returncopy = true) where t : class

if (result == null)

}if (returncopy)

else}}

catch

}

1、快取中有資料,直接走下述**就返回結果了

t result = cacheobject[key] as t;
2、快取中沒有資料,第1個進入的執行緒,獲取鎖並從資料庫去取資料,沒釋放鎖之前,其他並行進入的執行緒會等待,再重新去緩訪問資料。這樣就防止都去資料庫重複取資料,重複往快取中更新資料情況出現。

try

{lock (getmemorycachelockobject(key)){/*

system.argumentnullexception: value cannot be null.

at system.threading.monitor.enter(object obj)

at bqoolcommon.helpers.cache.memorycachelayer.get[t](string key, func`1 getdatawork, timespan absoluteexpiretime, boolean forcerefresh, boolean returncopy) in d:\source\bqoolcommon\bqoolcommon.helpers\cache\memorycachelayer.cs:line 46

*/t result = cacheobject[key] as t;

3、取得每個 key專有的 lock object;若同時有多個 thread要求相同資料,只會(到資料庫)查第一次,剩下的從 cache讀取。

string cachelockkey = string.format(memorycachelockobjectformat, key);

lock (cacheobject)

{var lockobject = cacheobject[cachelockkey];

if (lockobject == null)

{// 取得每個 key專屬的 lock object;若同時有多個 thread要求相同資料,只會(到資料庫)查第一次,剩下的從 cache讀取

lockobject = new object();

c 如何用lock解決快取擊穿

快取擊穿是指快取中沒有但資料庫中有的資料 一般是快取時間到期 這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。2.1 根據key生成object private static object getmemorycachelockobject...

快取擊穿的解決方法

摘抄自 在平常高併發的系統中,大量的請求同時查詢乙個 key 時,此時這個key正好失效了,就會導致大量的請求都打到資料庫上面去。這種現象我們稱為快取擊穿。解決辦法 上面的現象是多個執行緒同時去查詢資料庫的這條資料,那麼我們可以在第乙個查詢資料的請求上使用乙個 互斥鎖來鎖住它。其他的執行緒走到這一步...

應對快取擊穿的解決方法

分析乙個資料是否適合快取,我們要從訪問頻率 讀寫比例 資料一致性等要求去分析.在高併發下,多執行緒同時查詢同乙個資源,如果快取中沒有這個資源,那麼這些執行緒都會去資料庫查詢,對資料庫造成極大壓力,快取失去存在的意義.打個比方,資料庫是人,快取是防彈衣,子彈是執行緒,本來防彈衣是防止子彈打到人身上的,...