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