快取穿透 快取雪崩 快取擊穿

2021-09-26 09:35:32 字數 1459 閱讀 6297

參考:

使用頁面靜態化緩解伺服器壓力,將生成的頁面部署在nginx伺服器以此提高併發能力。此時提出了乙個問題:快取穿透,當使用者查詢乙個不存在的資料時,快取不命中則需要到資料庫查詢,查不到資料則不寫入快取,導致每次查詢這個資料都要訪問資料庫,造成快取穿透。在學習redis時大概了解過快取穿透,這裡記錄一下。

訪問頻率高,更改頻率低,即時性要求低的資料如商品列表,分類等。將此類資料放入快取中,使用者的請求不會到達資料庫,從而減輕資料庫的壓力

查詢乙個一定不存在的資料,由於快取是不命中時需要從資料庫查詢,造成快取穿透,查不到資料則不寫入快取,這個不存在的資料每次請求都要到資料庫去查詢。頻繁的訪問該key可能導致資料庫壓力過大而gg。

解決方案:

1.快取空物件

最簡單的,如果查詢結果為null,將空物件加入快取並且設定較短的過期時間。這樣快取中有了該key請求的結果便不會訪問資料庫。

快取空物件的問題:

1)設定較短過期時間是因為空物件結果也會占用快取空間,大量不存在的key會占用更多的記憶體空間,較短的過期時間可以讓其快速剔除

2)如果在物件剔除期間資料庫新增了該資料,會造成快取層和儲存層資料不一致

2.布隆過濾

參考:將可能存在的資料雜湊存入到bitmap中,一定不存在的key會被攔截,避免了對儲存層的查詢

3.加鎖

給查詢儲存層的**加鎖,防止同時大量的訪問資料庫

此外還有很多方法大概

某一時刻快取資料大批量過期,此時所有的查詢都是快取穿透,落在資料庫上,大量的併發訪問導致資料庫壓力過大就是快取雪崩。

解決方案:

1.還是簡單粗暴的方法,設定不同的過期時間,盡量避免大批資料同時過期

2.使用互斥鎖mutex key

當快取過期時,只讓乙個執行緒訪問資料庫重新構建快取,其餘執行緒等待快取構建完成後重新從快取中獲取資料。

分布式中常用redis中的setnx和memcache的add來實現

缺點會造成阻塞,使用者體驗不好

3.通關快取reload機制預先更新快取,在即將發生大併發訪問前手動觸發載入快取。

4.雙快取。兩份快取a,b, a的過期時間短, b的過期時間長,當a過期時使用者訪問b,此時a訪問資料庫更新快取,並更新b的快取

5.「永不過期」快取不設定過期時間,此時資料變成靜態的。所以把過期時間存在key對應的value中,使用者訪問時發現value要過期了,此時通過乙個後台的非同步執行緒進行快取的構建,次期間使用者訪問的依舊是過期資料。

快取擊穿是快取穿透的一種特殊情況,其key為熱點資料,一直被超高併發訪問。這時,這個資料過期了,大量的請求到達快取發現資料過期,都訪問資料庫載入快取,同樣給資料庫過大的壓力。

解決方案與雪崩相同

快取穿透 快取擊穿 快取雪崩

一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...

快取穿透,快取擊穿,快取雪崩

所謂的快取穿透,簡單來講就是查詢某些不存在的key時,快取和資料庫查詢結果都為空,而空的結果又不被快取起來,而導致每次查詢都去請求資料庫層的情況。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。過程 快取不命中,進而導致每次查詢都去查詢資料庫,快取也就失去了作...

快取穿透快取擊穿快取雪崩

1 快取穿透 1.1 什麼是快取穿透 快取穿透,是指查詢乙個資料庫一定不存在的資料 核心 快取和資料庫該值不存在 正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。1.2 帶來的...