什麼是快取穿透
快取穿透是指查詢乙個一定不存在的資料,由於快取沒有命中,這時候我們會資料庫查詢。出於容錯考慮,當我們從資料庫查詢不到資料的時候,則不會寫入快取,這個可能導致每次請求都去資料庫查詢,失去了快取的意義。在流量大的時候db可能就會掛掉,如果有人利用這個不存在key頻繁操作攻擊我們的應用,這就是漏洞。
以查詢使用者資訊為例,id=-1的使用者是肯定不存在的,但是現在有10000個請求,其中9000個都是請求id=-1的這個使用者,我們的資料庫很容易的就***。
快取穿透解決辦法
簡單粗暴,如果我們查詢資料庫結果為null的話,我們直接把這個null快取起來,並且設定乙個很短的過期時間。
以使用者為例,我們把所有的使用者id快取到乙個足夠大的bitmap中,訪問這個不存在的key的時候就行攔截,從而避免對資料庫造成的壓力
設定布隆過濾器(以後單開一篇部落格介紹)
什麼是快取雪崩
資料未載入到快取;快取同一時刻大面積失效或者宕機,從而導致所有請求都去查詢資料庫,造成資料庫cpu負載夜裡過高,甚至宕機;都會造成快取雪崩。
簡單來說的話,就是因為快取未命中或者快取系統的宕機,從而引起資料庫宕機成為快取雪崩
如何解決快取雪崩
如果針對快取未載入或者快取失效,那麼盡量讓快取失效時間盡量分布均勻
如果針對快取系統崩潰的話,可以構建redis主從模式+哨兵、redis cluster,避免全盤崩潰
hystrix熔斷器做保護,避免mysql***
快取穿透和快取雪崩的區別
好像快取穿透和快取雪崩有點相似,都是快取沒有查詢到去查詢資料庫造成的宕機。但是這兩點是有區別的,快取穿透是查詢乙個一定不存在的資料,而快取雪崩其中一點是查詢的資料是存在於資料庫中的,一定不要搞混了。
快取擊穿
針對某乙個key,我們設定了過期時間的key而失效,或者還未載入,如果某一時間被超高頻率的訪問,也有可能會造成資料庫掛掉。與快取雪崩相比,雪崩針對的是以系列key,而擊穿是針對乙個key。
比如10點的時候要去搶購乙個手機,10點這一刻有n多請求訪問伺服器,並且這時候我們的資料還沒有加入到快取中,導致所有請求都去資料庫查詢,這樣資料庫就很容易掛掉。
如何解決快取擊穿
讓key一直存在
使用互斥鎖
if (key不存在) else
查詢快取,寫入資料}}
什麼是快取穿透 快取雪崩 快取擊穿
快取穿透是指查詢乙個一定不存在的資料時,由於在快取中沒有這個key,這時會到db中去查詢,可是db中也沒有這條資料,這時也無法寫入快取,這就造成了快取穿透,如果這時有人利用這個漏洞頻繁攻擊應用,db就可能掛掉了 解決方案 可以把key存入快取中,value設定為空,過期時間最多不超過5分鐘 快取雪崩...
快取穿透 快取擊穿 快取雪崩
一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...
快取穿透,快取擊穿,快取雪崩
所謂的快取穿透,簡單來講就是查詢某些不存在的key時,快取和資料庫查詢結果都為空,而空的結果又不被快取起來,而導致每次查詢都去請求資料庫層的情況。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。過程 快取不命中,進而導致每次查詢都去查詢資料庫,快取也就失去了作...