摘要:緩存命中率過低緩存命中率指的是從緩存中找到數(shù)據(jù)的請求占所有請求的比重。因此之所以出現(xiàn)緩存命中率過低,自然就是因為熱點不夠熱,請求的數(shù)據(jù)非常分散。要緩解緩存命中率過低的問題,最直接的辦法當(dāng)然是加大緩存。
緩存的作用是在內(nèi)存中臨時存儲來自外部系統(tǒng)(如數(shù)據(jù)庫)的數(shù)據(jù),以便讓請求更快的得到響應(yīng)。如果請求數(shù)據(jù)在緩存中不存在,或者已經(jīng)超時失效,那么也要從外部系統(tǒng)查詢,然后放入緩存中,這個過程叫刷新緩存。
這是緩存的基本使用邏輯,但是實際當(dāng)中可能出現(xiàn)三種異常情況,它們會導(dǎo)致緩存起不到預(yù)期的使用效果,以至于系統(tǒng)性能明顯下降。
緩存命中率過低緩存命中率指的是從緩存中找到數(shù)據(jù)的請求占所有請求的比重。例如 100 個請求當(dāng)中有 90 個請求的結(jié)果可以直接從緩存中獲得,那么命中率就是 90%。剩下 10% 的請求就要從外部系統(tǒng)查詢數(shù)據(jù),填入緩存,然后再返回。
什么情況下緩存命中率高呢?請求的數(shù)據(jù)比較集中的時候,例如 80% 的請求集中在 20% 的數(shù)據(jù)上,這部分?jǐn)?shù)據(jù)也被稱作熱點之類的。熱點越熱,緩存命中率越高。
因此之所以出現(xiàn)緩存命中率過低,自然就是因為熱點不夠熱,請求的數(shù)據(jù)非常分散。命中率過低的后果就是很多請求的數(shù)據(jù)仍需從外部系統(tǒng)查詢,假如是數(shù)據(jù)庫的話,數(shù)據(jù)庫的壓力就會非常大,同時系統(tǒng)的響應(yīng)也明顯變慢。
要緩解緩存命中率過低的問題,最直接的辦法當(dāng)然是加大緩存。本地緩存不夠,就用分布式緩存,多臺機器分開存儲。
特例一:分散攻擊有時候系統(tǒng)正常情況下是存在熱點數(shù)據(jù)的,但突然有一天出現(xiàn)大量的分散請求,導(dǎo)致緩存命中率直線下降。這些異常的請求可以看作是有意的攻擊行為,目的就是讓系統(tǒng)無法響應(yīng)。
而遇到攻擊行為的話,加大緩存可能是徒勞的,這時候需要去識別請求,對于被歸類為攻擊的請求主動延長響應(yīng)時間,甚至拒絕返回結(jié)果。
比如說一個論壇,突然遇到大量請求,均勻的訪問五年內(nèi)的帖子內(nèi)容,導(dǎo)致數(shù)據(jù)庫負載很大,此時可以將訪問老帖子的請求(帖子ID通常是遞增的,ID越小表示發(fā)帖時間越久)返回時間適當(dāng)延長,比如延長到五分鐘。不過使用這種做法時千萬不要簡單的暫停線程,這會導(dǎo)致沒有多余的線程來處理正常的請求。
特例二:無效的 key有時候系統(tǒng)收到大量請求,這些請求的數(shù)據(jù)非但緩存中沒有,連數(shù)據(jù)庫也沒有,那么每個請求不但因為緩存未命中而去查詢數(shù)據(jù)庫,而且因為數(shù)據(jù)庫沒有記錄而無法填充到緩存。這是更加惡劣的情況。
遇到這種情況,同樣需要鑒別無效的請求。對于 key 自增的情況,可以通過值范圍來鑒別;而對于使用 UUID 的情況,就需要低成本的鑒別方式,布隆過濾器是一個選擇。
大量緩存項同時刷新緩存通常都是存在失效時間的,需要避免的一種情況就是大量緩存項在同一個時間點失效,如果此時對這些數(shù)據(jù)的請求量大,那么這些請求就會同時去刷新各自的緩存,這就將壓力傳遞到了外部系統(tǒng)上。避免這種情況的辦法就是在預(yù)定的失效時間基礎(chǔ)上加上一個隨機值,以錯開緩存項的失效時間。
大量請求刷新同一個緩存項一個請求遇到緩存失效,于是去刷新緩存,而在這個過程中又有大量請求來訪問正在刷新的緩存項,導(dǎo)致該緩存項完成本次刷新后,又立刻被另一個線程刷新,實質(zhì)上每個請求都因為緩存未命中而去訪問了外部系統(tǒng)。
出現(xiàn)這個現(xiàn)象的原因是設(shè)計上的不合理。當(dāng)一個緩存正在刷新時,訪問該緩存項的其他線程應(yīng)該等待刷新完畢,這樣它們就可以直接從緩存獲得結(jié)果了。線程同步當(dāng)然是用鎖。如果是分布式系統(tǒng),那就用分布式鎖。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/62093.html
摘要:緩存命中率過低緩存命中率指的是從緩存中找到數(shù)據(jù)的請求占所有請求的比重。因此之所以出現(xiàn)緩存命中率過低,自然就是因為熱點不夠熱,請求的數(shù)據(jù)非常分散。要緩解緩存命中率過低的問題,最直接的辦法當(dāng)然是加大緩存。 緩存的作用是在內(nèi)存中臨時存儲來自外部系統(tǒng)(如數(shù)據(jù)庫)的數(shù)據(jù),以便讓請求更快的得到響應(yīng)。如果請求數(shù)據(jù)在緩存中不存在,或者已經(jīng)超時失效,那么也要從外部系統(tǒng)查詢,然后放入緩存中,這個過程叫刷新...
摘要:當(dāng)緩存空間滿了,同步失敗,網(wǎng)絡(luò)阻塞,緩存寫失敗等原因,會出現(xiàn)緩存服務(wù)器上并沒有這個。這種問題,以前有過實踐,修改數(shù)據(jù)庫成功,而修改緩存失敗的情況,最主要就是緩存服務(wù)器掛了。而緩存服務(wù)器掛了,請求首先自然也就無法到達,從而直接訪問到數(shù)據(jù)庫。 原文摘自: 緩存穿透、并發(fā)和失效,來自一線架構(gòu)師的解決方案https://community.qingcloud.com/topic/463 在我們...
摘要:當(dāng)緩存空間滿了,同步失敗,網(wǎng)絡(luò)阻塞,緩存寫失敗等原因,會出現(xiàn)緩存服務(wù)器上并沒有這個。這種問題,以前有過實踐,修改數(shù)據(jù)庫成功,而修改緩存失敗的情況,最主要就是緩存服務(wù)器掛了。而緩存服務(wù)器掛了,請求首先自然也就無法到達,從而直接訪問到數(shù)據(jù)庫。 原文摘自: 緩存穿透、并發(fā)和失效,來自一線架構(gòu)師的解決方案https://community.qingcloud.com/topic/463 在我們...
摘要:當(dāng)緩存空間滿了,同步失敗,網(wǎng)絡(luò)阻塞,緩存寫失敗等原因,會出現(xiàn)緩存服務(wù)器上并沒有這個。這種問題,以前有過實踐,修改數(shù)據(jù)庫成功,而修改緩存失敗的情況,最主要就是緩存服務(wù)器掛了。而緩存服務(wù)器掛了,請求首先自然也就無法到達,從而直接訪問到數(shù)據(jù)庫。 原文摘自: 緩存穿透、并發(fā)和失效,來自一線架構(gòu)師的解決方案https://community.qingcloud.com/topic/463 在我們...
閱讀 3898·2021-11-22 13:52
閱讀 3749·2019-12-27 12:20
閱讀 2477·2019-08-30 15:55
閱讀 2240·2019-08-30 15:44
閱讀 2329·2019-08-30 13:16
閱讀 653·2019-08-28 18:19
閱讀 1984·2019-08-26 11:58
閱讀 3530·2019-08-26 11:47