前言
? ? ? ?自1946年第一臺(tái)電子數(shù)字計(jì)算機(jī)誕生至今已逾七十多年,伴隨著計(jì)算機(jī)的發(fā)展,計(jì)算機(jī)軟件的變化也是翻天覆地。當(dāng)前計(jì)算機(jī)軟件越來(lái)越向高抽象、高復(fù)用、高性能、高可靠等特性發(fā)展。本文只關(guān)注于全局中極小的一點(diǎn) -- 緩存 ,并結(jié)合筆者的實(shí)際工作經(jīng)驗(yàn)和大家一起討論一下相關(guān)內(nèi)容。
緩存使用歷程
? ? ? ? 筆者剛剛參加工作的時(shí)候,BS結(jié)構(gòu)剛剛發(fā)展起來(lái),Spring尚未一統(tǒng)天下,Hibernate也未遇對(duì)手;互聯(lián)網(wǎng)行業(yè)只是剛剛起步,反而是傳統(tǒng)的企業(yè)信息化系統(tǒng)如日中天。這類軟件系統(tǒng)的特點(diǎn)是:低抽象、低復(fù)用(各種企業(yè)內(nèi)部特殊定制,貌似現(xiàn)在也是這樣 ,很好奇SAAS是如何解決這些“需求”),一個(gè)系統(tǒng)總共使用人數(shù)不過(guò)二三百人,數(shù)據(jù)量不過(guò)百萬(wàn)。當(dāng)時(shí)的系統(tǒng)結(jié)構(gòu)是這樣的:

? ? ? ?再往后大家發(fā)現(xiàn),一個(gè)稍微復(fù)雜點(diǎn)的頁(yè)面大都涉及到多次的數(shù)據(jù)庫(kù)查詢(比如:語(yǔ)種、幣種、地區(qū)或各式各樣的業(yè)務(wù)碼表)性能損耗高到令人咋舌。于是不約而同的將一些相對(duì)固定的數(shù)據(jù)保存到本地緩存中,系統(tǒng)結(jié)構(gòu)便演化成如下圖(大多數(shù)關(guān)系數(shù)據(jù)庫(kù)也是提供緩存優(yōu)化的,但不在本文討論范圍內(nèi)):

? ? ? ?在這個(gè)階段,大型的項(xiàng)目(比如百萬(wàn)級(jí)以上)往往會(huì)利用f5或nginx配合SSO來(lái)實(shí)現(xiàn)高可用及負(fù)載均衡;但業(yè)務(wù)相關(guān)的緩存依舊在本地,并通過(guò)策略更新緩存信息(通常是定時(shí))。Local Cache雖然性能極佳,但也有其固有的問(wèn)題:1、成本昂貴,無(wú)法大規(guī)模擴(kuò)展? 2、在某個(gè)時(shí)間段內(nèi)不同服務(wù)器緩存的信息不一致。所以Local Cache 又演化為Centralized Cache ,如下圖:

? ? ? ? 隨著互聯(lián)網(wǎng)的興起,為滿足高并發(fā)、大數(shù)據(jù)、低成本的要求,軟件系統(tǒng)架構(gòu)發(fā)生了革命性的變化。即由集中式像分布式服務(wù)演化,概要結(jié)構(gòu)如下圖:

? ? ? ? 分布式服務(wù)治理+ 集中式緩存可以滿足目前絕大多數(shù)業(yè)務(wù)場(chǎng)景的需要,并且由于可選開(kāi)源產(chǎn)品的豐富使其構(gòu)建大為簡(jiǎn)化。但集中式的緩存也有缺點(diǎn),那就是IO消耗。程序每次訪問(wèn)緩存的時(shí)候都會(huì)與緩存服務(wù)器產(chǎn)生網(wǎng)絡(luò)通訊(最少也需10ms以上),雖然在多數(shù)情況下這種消耗是可以接受的,但在一些極度要求吞吐量和并發(fā)量的系統(tǒng)中,任何性能優(yōu)化都不為過(guò)。于是緩存便又演化成混合型(多級(jí)緩存),如下圖:

? ? ? ? 使用混合型緩存,可以將少量高頻次訪問(wèn)的數(shù)據(jù)緩存在本地,盡量減少因訪問(wèn)緩存服務(wù)而導(dǎo)致的IO開(kāi)銷。
? ? ? ? 軟件系統(tǒng)在使用緩存上從無(wú)到有,從簡(jiǎn)到繁的過(guò)程,就是軟件系統(tǒng)發(fā)展的過(guò)程。伴隨著互聯(lián)網(wǎng)的瘋狂擴(kuò)張,軟件也會(huì)把自己的觸角延伸到方方面面。這必然會(huì)帶來(lái)更多的問(wèn)題,更復(fù)雜的環(huán)境及更多的解決方案。