新聞中心
緩存的使用,是一個(gè)逐漸演進(jìn)的過(guò)程。問(wèn)一下你自己,最直接的使用緩存的原因是什么?無(wú)它,唯快而已!

追溯一下自己最開(kāi)始使用緩存的場(chǎng)景,一些數(shù)據(jù)庫(kù)里存儲(chǔ)的不變的配置信息,服務(wù)啟動(dòng)時(shí),直接加載到本地公共模塊,方便其它功能模塊共享使用。這便是最基本,最簡(jiǎn)單的本地緩存應(yīng)用。
服務(wù)與緩存
所謂的服務(wù),簡(jiǎn)而言之,一層應(yīng)用+一層數(shù)據(jù),應(yīng)用從數(shù)據(jù)層獲取數(shù)據(jù)然后加工輸出。
數(shù)據(jù)層,通常我們指的是持久化介質(zhì)上的持久化存儲(chǔ)。它有多種形式的,可以是文件,或者數(shù)據(jù)庫(kù)。
數(shù)據(jù)存儲(chǔ)在持久化介質(zhì)上,而應(yīng)用運(yùn)行與內(nèi)存中。內(nèi)存和持久化介質(zhì)是兩個(gè)有著量級(jí)速度差別的不同介質(zhì),由此,應(yīng)用和數(shù)據(jù)之間便有了“矛盾”。
有了這“矛盾”的引子,便有了對(duì)緩存的迫切需求。
我們說(shuō)的緩存,必然要是存放于內(nèi)存中的,這樣它便能距離應(yīng)用更近,更快的給出應(yīng)用所需要的數(shù)據(jù),以獲得更快的服務(wù)響應(yīng)。
當(dāng)然,并不是緩存完全隔絕持久層數(shù)據(jù)。緩存,伴隨而生的一個(gè)詞叫做命中率。
當(dāng)我們查詢的數(shù)據(jù)存在于緩存中的時(shí)候,我們稱之為“命中”,此時(shí),所需數(shù)據(jù)可以直接由緩存提供。
而對(duì)于未“命中”的數(shù)據(jù),則需要穿過(guò)緩存層,進(jìn)一步去持久化數(shù)據(jù)層獲取。此種情景,我們稱之為緩存穿透。
數(shù)據(jù)獲取之后,在返回給應(yīng)用之前,我們需要重新填充緩存,以供下一次“命中”查詢。
當(dāng)然,上述我們所述只是指“讀”查詢情景。當(dāng)應(yīng)用發(fā)生數(shù)據(jù)操作變更,我們則需要將變更同時(shí)更新到持久層及緩沖層。
此時(shí),我們又會(huì)面臨另外一個(gè)問(wèn)題,“先”與“后”的問(wèn)題。
“先”與“后”的問(wèn)題,我們也稱之為緩存一致性問(wèn)題。如果先更新緩存,則可能面臨持久層更新失敗,產(chǎn)生緩存臟數(shù)據(jù)的問(wèn)題。
然則,假如先更新持久層,我們又不得不面對(duì)從持久層更新成功之后到緩存更新之前這個(gè)間期,緩存對(duì)外提供舊數(shù)據(jù)的窘境。
緩存一致性問(wèn)題,尤其在高并發(fā)環(huán)境,需要根據(jù)特定場(chǎng)景進(jìn)行更精妙的控制。比如,并發(fā)修改的一致性鎖;比如,異步刷新的延遲刷新等等。
緩存與更新
上文我們提到了緩存更新一致性的問(wèn)題,從實(shí)際應(yīng)用情景來(lái)講,可以細(xì)分為強(qiáng)一致性需求,弱一致性需求及最終一致性需求。
強(qiáng)一致性需求
比如,交易狀態(tài)信息,已下單、支付中,已支付等應(yīng)用,需要我們主動(dòng)及時(shí)進(jìn)行關(guān)聯(lián)更新并保證事務(wù)層面的一致性。
應(yīng)景而生的許多包括分布式事務(wù)等理論也為我們解決實(shí)際問(wèn)題提供了很好的踐行方案。
弱一致性需求
一些涉及不太重要的信息更新,能夠容忍短時(shí)間(比如,幾分鐘)內(nèi)持久層數(shù)據(jù)和緩存數(shù)據(jù)不一致的場(chǎng)景。
比如不外顯的描述信息,統(tǒng)計(jì)性的計(jì)數(shù)緩存信息等。通??梢圆扇‘惒教幚淼姆绞健?/p>
一些一段短時(shí)間內(nèi)(幾秒,幾分鐘)輸出固定信息的場(chǎng)景。比如每隔 30s 更新熱點(diǎn)信息,票價(jià)信息等??梢酝ㄟ^(guò)設(shè)置緩存超時(shí)自動(dòng)剔除的方式進(jìn)行處理。
最終一致性需求
保障數(shù)據(jù)狀態(tài)的最終一致性。
緩存的粒度
所謂粒度,也即緩存信息塊層級(jí),大小。選擇何種粒度的緩存,取決于我們應(yīng)用的整體架構(gòu),數(shù)據(jù)存儲(chǔ)規(guī)劃及具體的應(yīng)用場(chǎng)景。
拿用戶信息來(lái)舉例,是緩存活躍信息?還是相對(duì)靜態(tài)的信息?是按單屬性層級(jí)來(lái)緩存?還是按整個(gè)對(duì)象信息?
不同的數(shù)據(jù)粒度,也決定著我們存儲(chǔ)緩存的形式:整個(gè)對(duì)象的二進(jìn)制序列化數(shù)據(jù)?更透明直觀的 json 字符串?屬性與值的一一映射?
每種形式都有各自的使用優(yōu)缺點(diǎn),開(kāi)發(fā)者可以從應(yīng)用、存儲(chǔ)及維護(hù)成本各方面進(jìn)行全面性評(píng)估選擇。
緩存穿透的危害
前面我們提到過(guò)關(guān)于緩存穿透發(fā)生的原因:緩存未命中。那為什么會(huì)未命中呢?
數(shù)據(jù)暫時(shí)不存在于緩存中
所謂暫時(shí),可以指數(shù)據(jù)初始尚未加載到緩存,lazy load 按需按時(shí)實(shí)時(shí)加載應(yīng)用。
也可以是緩存數(shù)據(jù)被我們特定的緩存過(guò)期策略自動(dòng)或主動(dòng)過(guò)期,通常使用的過(guò)期策略包括元素?cái)?shù)量限制,內(nèi)存占用限制及生存時(shí)間限制。
其實(shí),無(wú)論是初始未加載還是緩存過(guò)期,刪除,這些都屬于我們假定的正常應(yīng)用場(chǎng)景,再次我們不予過(guò)多評(píng)論。
數(shù)據(jù)從來(lái)不存在
當(dāng)一個(gè)查詢不存在數(shù)據(jù)的請(qǐng)求到來(lái),其必然會(huì)穿過(guò)緩存,達(dá)到持久化存儲(chǔ)層。
持久化存儲(chǔ)的響應(yīng)能力是有限的,當(dāng)這種請(qǐng)求達(dá)到一定的量級(jí),服務(wù)可能就要面臨著宕機(jī)的危險(xiǎn)。
至此,我們對(duì)于緩存的作用認(rèn)知,也需要進(jìn)一步延伸:降低下層負(fù)載,保護(hù)后端資源。
造成這種緩存穿透的原因可以簡(jiǎn)單的分為內(nèi)外兩方面誘因:內(nèi)部的應(yīng)用邏輯問(wèn)題及外部惡意攻擊、爬蟲(chóng)干擾等。
內(nèi)部問(wèn)題容易解決,內(nèi)觀可預(yù)知,良性優(yōu)化即可;反而是外部的不可預(yù)料,可能需要更謹(jǐn)慎的進(jìn)行多面的防御性處理。
其實(shí),不論內(nèi)部還是外部,在緩存層面需要處理的就只有一件事:有效攔截穿透。
到此,通常慣性的思維第一步,就是把造成緩存穿透的數(shù)據(jù)放置到緩存中,無(wú)論其是否存在在于持久化存儲(chǔ)中。
比如對(duì)于正常的已刪除的用戶數(shù)據(jù),做緩存層面的軟刪除處理,以狀態(tài)信息做標(biāo)注(我存在,其實(shí)我不存在!)。就可以很好的解決此類問(wèn)題造成的穿透壓力。
但是,我們有也個(gè)清楚的認(rèn)知就,就是真正能夠造成危害的是那些非正常的入侵?jǐn)?shù)據(jù)。
比如,窮盡遍歷的差別數(shù)據(jù),一一存入緩存,唯一的結(jié)果就是緩存資源的溢滿用盡。這是一種相當(dāng)恐怖的場(chǎng)景。
針對(duì)此種“大數(shù)據(jù)”型攻擊,布隆過(guò)濾攔截或許可以成為一個(gè)不錯(cuò)的選擇。
也談緩存雪崩
上面一節(jié)中我們談到了緩存的承載保護(hù)功能,一面快速響應(yīng),一面背負(fù)保護(hù)持久層數(shù)據(jù)。在某些以讀為主的服務(wù)中,緩存幾近承載近乎 90% 以上的請(qǐng)求。
但是,如果緩存由于某些原因一時(shí)不能提供正常服務(wù)時(shí),所有的請(qǐng)求就會(huì)穿透到持久存儲(chǔ)層,造成存儲(chǔ)層極端宕機(jī)情況發(fā)生。
那么,我們應(yīng)該如何應(yīng)對(duì)這種情況呢?
高可用
緩存的高可用是應(yīng)對(duì)緩存雪崩的首要保障:主從,讀寫(xiě)分離,動(dòng)態(tài)擴(kuò)容,一致性均衡,異地容災(zāi)等。
實(shí)際應(yīng)用如 Redis 的哨兵模式,集群部署等:
服務(wù)治理之限流、熔斷降級(jí)
服務(wù)治理的目的是什么?服務(wù)的穩(wěn)定性。限流即對(duì)異常流量的控制;熔斷、降級(jí)標(biāo)的核心服務(wù)資源的保護(hù)。
緩存、持久化數(shù)據(jù)存儲(chǔ)都是資源,或者我們可以從對(duì)緩存的流控及對(duì)持久化數(shù)據(jù)存儲(chǔ)的熔斷、降級(jí)保護(hù)來(lái)著手應(yīng)對(duì)緩存雪崩的情景發(fā)生。
緩存元素的集中過(guò)期導(dǎo)致緩存失效
對(duì)于設(shè)置了過(guò)期時(shí)間的緩存元素,如果發(fā)生元素同時(shí)過(guò)期,則會(huì)有瞬間的外部請(qǐng)求直接到達(dá)持久存儲(chǔ)層。
在實(shí)際的緩存應(yīng)用中,需要采取一定的措施,實(shí)現(xiàn)緩存元素過(guò)期時(shí)間的均勻分布。
作者:WindWant
編輯:陶家龍
出處:cnblogs.com/niejunlei/p/12914336.html
文章名稱:緩存,確實(shí)很香,卻也很受傷!
瀏覽地址:http://www.dlmjj.cn/article/dhhiisp.html


咨詢
建站咨詢
