摘要:緩存穿透場景當(dāng)通過一個去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結(jié)果為緩存系統(tǒng)就不會緩存該數(shù)據(jù)每次該查詢都會經(jīng)過數(shù)據(jù)庫層造成沒有必要的開銷解決方案將該緩存至緩存系統(tǒng)中為一個特殊值緩存失效場景由于初始化的時候某些緩存過期時間設(shè)置的都一樣一段時間以后緩存全部失效在
緩存穿透
場景:當(dāng)通過一個key去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結(jié)果為null,緩存系統(tǒng)就不會緩存該數(shù)據(jù),每次該key查詢都會經(jīng)過數(shù)據(jù)庫層,造成沒有必要的DB開銷
解決方案:將該key緩存至緩存系統(tǒng)中,value為一個特殊值(^^,&&...)
場景:由于初始化的時候某些緩存過期時間設(shè)置的都一樣,一段時間以后緩存全部失效,在這一瞬間的會增大DB的壓力
解決方案:在過期時間上加一個隨機值;分析用戶行為,盡量讓失效時間均勻分布
場景:key緩存過期失效而新緩存未到期間,該key的查詢所有請求都會去查詢數(shù)據(jù),造成DB壓力上升,不必要的DB開銷
解決方案:
加鎖排隊重建,使請求可以串行化,而不用全部的請求都去查詢數(shù)據(jù)庫
假設(shè)key的過期時間是A,創(chuàng)建一個key_sign,它的過期時間比A小,查詢key的時候檢查key_sign是否已經(jīng)過期,如果過期則加鎖后臺起一個線程異步去更新key的值,而實際的緩存沒有過期(如果實際緩存已經(jīng)過期,需要加鎖排隊重建),但是會浪費雙份緩存
在原有的value中存一個過期值B,B比A小,取值的時候根據(jù)B判斷value是否過期,如果過期,解決方案同上
犧牲用戶體驗,當(dāng)發(fā)現(xiàn)緩存中沒有對應(yīng)的數(shù)據(jù)直接返回失敗,并且把需要的數(shù)據(jù)放入一個分布式隊列,后臺通過異步線程更新隊列中需要更新的緩存
緩存污染場景:一些非正常操作(導(dǎo)出excel,運營偶發(fā)性訪問)而導(dǎo)致內(nèi)存中出現(xiàn)很多冷數(shù)據(jù)
解決方案:選取合適的緩存算法(LUR-N算法)
場景:緩存首次上線,如果網(wǎng)站的訪問量很大,所有的請求都經(jīng)過數(shù)據(jù)庫(如果訪問量比較少,可以由用戶訪問自行緩存)
解決方案:緩存預(yù)熱,在系統(tǒng)上線之前,所有的緩存都預(yù)先加載完畢(增加一個刷新緩存程序,上線后手動刷新或發(fā)布時自動調(diào)用刷用)
緩存失效策略:添加key的時候要設(shè)置一個過期時間,采用惰性刪除和定時刪除相結(jié)合的策略刪除過期鍵
多級緩存:線程級->內(nèi)存級->進程級->文件(靜態(tài)資源)->分布式(redis)->Db結(jié)果.
二級緩存:二級緩存更多的解決是,緩存穿透與程序的健壯性,當(dāng)集中式緩存出現(xiàn)問題的時候,我們的應(yīng)用能夠繼續(xù)運行;一些熱點數(shù)據(jù)做成內(nèi)存緩存,這些數(shù)據(jù)是在上線之前是已知的(比如說秒殺,大促商品),通過配置定時任務(wù)定時刷新內(nèi)存緩存,完成和分布式緩存的數(shù)據(jù)置換;更加自動化的方案,可以根據(jù)上游自動發(fā)現(xiàn)熱點數(shù)據(jù),廣播消息替換現(xiàn)在集群中內(nèi)存緩存的數(shù)據(jù)(但在整個集群中廣播,成本比較高,并且二級緩存的管理的成本也很大);
參考資料緩存穿透、并發(fā)和失效,來自一線架構(gòu)師的解決方案
那些年我們一起追過的緩存寫法
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21794.html
摘要:緩存穿透場景當(dāng)通過一個去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結(jié)果為緩存系統(tǒng)就不會緩存該數(shù)據(jù)每次該查詢都會經(jīng)過數(shù)據(jù)庫層造成沒有必要的開銷解決方案將該緩存至緩存系統(tǒng)中為一個特殊值緩存失效場景由于初始化的時候某些緩存過期時間設(shè)置的都一樣一段時間以后緩存全部失效在 緩存穿透 場景:當(dāng)通過一個key去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結(jié)果為null,緩存系統(tǒng)就不會緩存該數(shù)據(jù),每次該key查詢都會經(jīng)過數(shù)據(jù)庫層,造成沒有必要的D...
摘要:緩存穿透場景當(dāng)通過一個去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結(jié)果為緩存系統(tǒng)就不會緩存該數(shù)據(jù)每次該查詢都會經(jīng)過數(shù)據(jù)庫層造成沒有必要的開銷解決方案將該緩存至緩存系統(tǒng)中為一個特殊值緩存失效場景由于初始化的時候某些緩存過期時間設(shè)置的都一樣一段時間以后緩存全部失效在 緩存穿透 場景:當(dāng)通過一個key去數(shù)據(jù)庫查詢出來的數(shù)據(jù)結(jié)果為null,緩存系統(tǒng)就不會緩存該數(shù)據(jù),每次該key查詢都會經(jīng)過數(shù)據(jù)庫層,造成沒有必要的D...
摘要:淺談網(wǎng)站性能之前端性能優(yōu)化性能優(yōu)化的目的無非是減少用戶流量消耗,提升用戶首屏體驗,提升用戶訪問速度,讓用戶專注內(nèi)容本身。前端性能優(yōu)化減少請求數(shù)量基本原理在瀏覽器與服務(wù)器進行通信時,主要是通過進行通信。 最近項目慢慢走上正軌,需求趨于平穩(wěn),這才想起需要對整站進行性能優(yōu)化。經(jīng)過一段時間的學(xué)習(xí),結(jié)合現(xiàn)在項目的實際性能情況,發(fā)現(xiàn)確實有許多地方可以進行優(yōu)化。于是就開始了我的前端性能優(yōu)化之旅。以下...
摘要:淺談網(wǎng)站性能之前端性能優(yōu)化性能優(yōu)化的目的無非是減少用戶流量消耗,提升用戶首屏體驗,提升用戶訪問速度,讓用戶專注內(nèi)容本身。前端性能優(yōu)化減少請求數(shù)量基本原理在瀏覽器與服務(wù)器進行通信時,主要是通過進行通信。 最近項目慢慢走上正軌,需求趨于平穩(wěn),這才想起需要對整站進行性能優(yōu)化。經(jīng)過一段時間的學(xué)習(xí),結(jié)合現(xiàn)在項目的實際性能情況,發(fā)現(xiàn)確實有許多地方可以進行優(yōu)化。于是就開始了我的前端性能優(yōu)化之旅。以下...
閱讀 2115·2023-04-25 20:52
閱讀 2507·2021-09-22 15:22
閱讀 2134·2021-08-09 13:44
閱讀 1775·2019-08-30 13:55
閱讀 2820·2019-08-23 15:42
閱讀 2293·2019-08-23 14:14
閱讀 2886·2019-08-23 13:58
閱讀 3019·2019-08-23 11:49