架構 快取擊穿問題解決方案

2021-09-13 17:32:29 字數 730 閱讀 5071

先看一下這個偽**邏輯

data = redis.getdata()

if (data != null)

data = db.getdata();

redis.set(data);

return data;

這段**看起來沒什麼問題,當從快取中取不到資料時,穿透到db獲取資料,並將資料寫入快取。邏輯是沒有問題的,但是在高併發下會有問題,在判斷快取中是否有資料時,有可能多個執行緒判斷為空,直接從db拿資料。如果db的tps較低,會導致db癱瘓。

解決快取擊穿的問題,主要思路是限制回源的請求量。

1)使用雙重檢查鎖

這個使用單例模式的時候也會用到

data = redis.getdata()

if (data != null)

synchronized (this)

data = db.getdata();

redis.set(data);

}return data;

這樣當多個併發取不到快取的時候,只有乙個執行緒能夠穿透都db層。如果是n臺機器,就只有n個請求打到db裡,請求數量比較容易控制。

1)如果從資料庫中獲取不到資料,則也需要快取,避免惡意攻擊。

快取擊穿問題解決思路

後端分布式快取是 服務端經常用到的一種技術,在讀多寫少的業務場景中,通過使用快取可以有效地支撐高併發的訪問量,對後端的資料庫等資料來源做到很好地保護。現在市面上有很多分布式快取,比如redis memcached以及阿里的tair等,不管我們使用的哪種快取產品,基本上都會遇到快取擊穿 快取失效以及熱...

快取失效 快取穿透問題解決方案

快取失效 快取雪崩 引起這個原因的主要因素是高併發下,我們一般設定乙個快取的過期時間時,可能有一些會設定5分鐘啊,10分鐘這些 併發很高時可能會出在某乙個時間同時生成了很多的快取,並且過期時間在同一時刻,這個時候就可能引發 當過期時間到後,這些快取同時失效,請求全部 到db,db可能會壓力過重。處理...

快取熱點問題解決方案

快取熱點問題解決方案 問題描述 同一時間訪問同乙個快取key的請求數量過高,導致某台特定的redis伺服器壓力過大,而其他的redis伺服器沒有分擔到壓力。舉例說明 店鋪活動查詢的時候快取key為店鋪編碼,value為店鋪能夠參加的活動編碼資訊,某個時候店鋪搞活動瞬時redis訪問命令數飆公升,熱點...