摘要:但是緩存和在實(shí)現(xiàn)強(qiáng)一致性時(shí)必然存在同步時(shí)間差。在系統(tǒng)啟動(dòng)時(shí)將需要保證強(qiáng)一致性的數(shù)據(jù)載入緩存,所有操作和查詢只修改緩存,緩存的數(shù)據(jù)可以異步的同步到。
在使用緩存系統(tǒng)并且在系統(tǒng)存在高并發(fā)的情況下(可能要求強(qiáng)一致性),可能出現(xiàn)如下問題:
1. 緩存穿透
緩存穿透是指,查詢的數(shù)據(jù)并不存在于緩存系統(tǒng)中導(dǎo)致必須查詢DB的情況。
緩存穿透可能被利用作為系統(tǒng)攻擊的點(diǎn)。例如:重復(fù)查詢系統(tǒng)之不存在的key(不存在于緩存和DB)
解決思路:
如果查詢的key不存在于緩存系統(tǒng)中那么,在緩存系統(tǒng)中增加此key,并且將值置為null(或其他的特殊值,此值代表緩存系統(tǒng)尚未收錄),然后查詢DB并更新至緩存系統(tǒng)。如果此key不存在于系統(tǒng)中,則將此key在緩存中置為特殊值(此特殊值表示系統(tǒng)不存在此值)
2.緩存并發(fā)
緩存高并發(fā)是指,在并發(fā)重復(fù)的大量請(qǐng)求緩存數(shù)據(jù)時(shí),如果緩存系統(tǒng)不存在此key(可能時(shí)攻擊也可能不是),那么將導(dǎo)致大量的重復(fù)請(qǐng)求首先引起緩存穿透問題,其次極大增加DB的壓力,在此場(chǎng)景下緩存失去了應(yīng)有作用。
緩存并發(fā)也可能被利用作為系統(tǒng)攻擊點(diǎn)。除了上述的緩存穿透之外,也可能導(dǎo)致DB拒絕服務(wù)。例如:發(fā)送大量DB有但是緩存沒有的數(shù)據(jù)(存在于DB不存在于緩存)
解決思路:
如果查詢的是同一key,則加鎖處理;如果查詢時(shí)不同key則隊(duì)列處理
3.緩存失效
緩存失效是指,給某些有時(shí)效性的緩存內(nèi)容設(shè)定過期時(shí)間,到達(dá)過期時(shí)間之后,對(duì)應(yīng)緩存失效了。簡(jiǎn)單拓展,緩存內(nèi)容在沒有被及時(shí)更新也是緩存失效,一般我們需要緩存的數(shù)據(jù)在我們修改DB的時(shí)候會(huì)同步修改緩存。
如果設(shè)定緩存失效時(shí)間都是一致的,那么會(huì)導(dǎo)致,在同一時(shí)間大量緩存失效,這時(shí)候如果有大量請(qǐng)求請(qǐng)求失效緩存則造成緩存穿透和緩存并發(fā)問題。
解決思路:
控制緩存失效時(shí)間,不讓緩存在同一時(shí)間失效,失效時(shí)間對(duì)應(yīng)不同的key設(shè)置隨機(jī)時(shí)間失效,將請(qǐng)求分配到多個(gè)時(shí)間中減輕DB壓力
4.緩存強(qiáng)一致性要求
緩存強(qiáng)一致性是指,緩存和DB是的操作時(shí)同步的。但是緩存和DB在實(shí)現(xiàn)強(qiáng)一致性時(shí)必然存在同步時(shí)間差。
解決思路:
首先我們需要保證我們的緩存系統(tǒng)時(shí)高可用的。在系統(tǒng)啟動(dòng)時(shí)將需要保證強(qiáng)一致性的數(shù)據(jù)載入緩存,所有操作和查詢只修改緩存,緩存的數(shù)據(jù)可以異步的同步到DB。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/61974.html
摘要:為了保證緩存的一致性,緩存控制器跟蹤每一個(gè)緩存行的狀態(tài),這些狀態(tài)的數(shù)量是有限的。用來表示在體系中響應(yīng)其他緩存的特定緩存。如今,內(nèi)存控制器的流量使用一個(gè)單獨(dú)的總線來傳輸。用于緩存段的緩存控制器記錄了哪個(gè)核心可能改變自己的緩存行。 即使是資深的技術(shù)人員,我經(jīng)常聽到他們談?wù)撃承┎僮魇侨绾螌?dǎo)致一個(gè)CPU緩存的刷新。看來這是關(guān)于CPU緩存如何工作和緩存子系統(tǒng)如何與執(zhí)行核心交互的一個(gè)常見誤區(qū)。本文...
摘要:馬蜂窩推薦系統(tǒng)對(duì)于請(qǐng)求的平均處理時(shí)延要求在級(jí)別,時(shí)延的線保持在以內(nèi)。任務(wù)隊(duì)列與異步寫入這里我們使用了中的線程池來實(shí)現(xiàn)。三優(yōu)化方向基于和,我們?cè)诂F(xiàn)有的推薦系統(tǒng)中增加了一個(gè)本地容災(zāi)緩存系統(tǒng),當(dāng)依賴服務(wù)或者應(yīng)用本身突發(fā)異常時(shí)可以返回緩存的數(shù)據(jù)。 數(shù)據(jù)庫突然斷開連接、第三方接口遲遲不返回結(jié)果、高峰期網(wǎng)絡(luò)發(fā)生抖動(dòng)...... 當(dāng)程序突發(fā)異常時(shí),我們的應(yīng)用可以告訴調(diào)用方或者用戶「對(duì)不起,服務(wù)器出了...
摘要:馬蜂窩推薦系統(tǒng)對(duì)于請(qǐng)求的平均處理時(shí)延要求在級(jí)別,時(shí)延的線保持在以內(nèi)。任務(wù)隊(duì)列與異步寫入這里我們使用了中的線程池來實(shí)現(xiàn)。三優(yōu)化方向基于和,我們?cè)诂F(xiàn)有的推薦系統(tǒng)中增加了一個(gè)本地容災(zāi)緩存系統(tǒng),當(dāng)依賴服務(wù)或者應(yīng)用本身突發(fā)異常時(shí)可以返回緩存的數(shù)據(jù)。數(shù)據(jù)庫突然斷開連接、第三方接口遲遲不返回結(jié)果、高峰期網(wǎng)絡(luò)發(fā)生抖動(dòng)...... 當(dāng)程序突發(fā)異常時(shí),我們的應(yīng)用可以告訴調(diào)用方或者用戶「對(duì)不起,服務(wù)器出了點(diǎn)問題」...
摘要:從視角理解系統(tǒng)結(jié)構(gòu)連載關(guān)注我的微博鏈接了解最新動(dòng)態(tài)從我的前一篇博文中我們知道了緩存及緩存行的概念同時(shí)用一個(gè)例子說明了編寫單線程代碼時(shí)應(yīng)該注意的問題下面我們討論更為復(fù)雜而且更符合現(xiàn)實(shí)情況的多核編程時(shí)將會(huì)碰到的問題這些問題更容易犯連包作者大師的 從Java視角理解系統(tǒng)結(jié)構(gòu)連載, 關(guān)注我的微博(鏈接)了解最新動(dòng)態(tài) 從我的前一篇博文中, 我們知道了CPU緩存及緩存行的概念, 同時(shí)用一個(gè)例子說...
閱讀 901·2023-04-26 01:37
閱讀 3376·2021-09-02 15:40
閱讀 969·2021-09-01 10:29
閱讀 2900·2019-08-29 17:05
閱讀 3428·2019-08-28 18:02
閱讀 1185·2019-08-28 18:00
閱讀 1494·2019-08-26 11:00
閱讀 2618·2019-08-26 10:27