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