系統(tǒng)性能提升優(yōu)先法寶 | 緩存應(yīng)用實(shí)踐

? ? ? 作者:徐賢軍,12年加入京東系,從事架構(gòu)設(shè)計(jì)與開發(fā)工作;在架構(gòu)設(shè)計(jì)、系統(tǒng)優(yōu)化上有較豐富實(shí)戰(zhàn)經(jīng)歷


? ? ? ? 天下武功唯快不破,如再配上如葵花寶典那樣的秘籍,不能說(shuō)人人都可以成東方不敗那樣的武林至尊,至少可以修煉成為林平之這樣的高手;緩存是我們系統(tǒng)性能提升優(yōu)先法寶,在互聯(lián)網(wǎng)應(yīng)用系統(tǒng)中,屢試不爽,網(wǎng)上有很多資料介紹緩存理論及使用策略,在這就不涉及,只是歸歸類,分享以前自己碰到場(chǎng)景及如何使用。

? ? ? ? 接下來(lái)主要分兩部分介紹:緩存分類與應(yīng)用實(shí)踐案例;

緩存分類

? ? ? 常見有以下幾類:客戶端、瀏覽器、CDN緩存、NGINX緩存、應(yīng)用緩存及統(tǒng)一緩存(如redis);

緩存分類:用戶->數(shù)據(jù)層

? ? ? 客戶端緩存:很少使用,一般都是傳統(tǒng)企業(yè)會(huì)使用;把不變化或很長(zhǎng)時(shí)間才變化數(shù)據(jù)按一定格式存儲(chǔ)在客戶端的本地文件中,使用時(shí)通過js讀取解析使用,延用了C/S結(jié)構(gòu)的方式,適合數(shù)據(jù)量很大業(yè)務(wù)且技術(shù)有所不足的開發(fā)。

? ? ? 瀏覽器緩存:這種使用很廣泛,極大地提升了用戶體驗(yàn),但有時(shí)沒及時(shí)更新導(dǎo)致顯示“錯(cuò)誤”的信息;把已經(jīng)請(qǐng)求過的Web資源(如html頁(yè)面,圖片,js,css等)拷貝一份副本儲(chǔ)存在瀏覽器中,緩存會(huì)根據(jù)進(jìn)來(lái)的請(qǐng)求保存輸出內(nèi)容的副本;帶來(lái)的好處有三點(diǎn):減少網(wǎng)絡(luò)帶寬消耗;降低服務(wù)器壓力;減少網(wǎng)絡(luò)延遲,加快頁(yè)面打開速度;適合請(qǐng)求量大、靜態(tài)的數(shù)據(jù)請(qǐng)求。

? ? ? CDN緩存:是在用戶和服務(wù)器之間增加cache層,把數(shù)據(jù)存放到內(nèi)容分發(fā)網(wǎng)絡(luò)機(jī)房服務(wù)器中,用戶請(qǐng)求進(jìn)從最近的CDN節(jié)點(diǎn)獲??;也主要緩存圖片、js及css文件;CDN需要付費(fèi),有些規(guī)模的網(wǎng)站才會(huì)使用;

? ? ? NGINX緩存:對(duì)客戶已經(jīng)訪問過的內(nèi)容在Nginx服務(wù)器本地建立副本,達(dá)到減少Nginx服務(wù)器與后端服務(wù)器之間的網(wǎng)絡(luò)流量;

? ? ? 應(yīng)用緩存:是指在后端應(yīng)用中使用緩存,如java常使用中Ehcache及gauva緩存組件進(jìn)行數(shù)據(jù)緩存;也可以針對(duì)特殊場(chǎng)景在請(qǐng)求中進(jìn)行線程緩存;適合調(diào)用量大且應(yīng)用內(nèi)部方法間調(diào)用,減少網(wǎng)絡(luò)消耗;

? ? ? 統(tǒng)一緩存:使用內(nèi)存減少對(duì)數(shù)據(jù)庫(kù)的直接訪問,提高網(wǎng)站性能;如使用memcache或redis搭建緩存服務(wù);

? ? ? ? 前四類都是在網(wǎng)絡(luò)傳輸中進(jìn)行數(shù)據(jù)緩存,一般是研發(fā)很少去具體使用;后兩類在應(yīng)用中緩存,在開發(fā)中經(jīng)常使用,接下來(lái)介紹下該種類的實(shí)踐;

實(shí)踐案例

1、熱點(diǎn)key

? ? ? 場(chǎng)景:在大促期間,給所有活動(dòng)頁(yè)及頻道頁(yè)提供側(cè)滑html片段數(shù)據(jù),會(huì)有修改;特點(diǎn):數(shù)據(jù)記錄少,調(diào)用量比較大(峰值400萬(wàn)/分鐘);

? ? ? 在接到需求時(shí),第一反應(yīng)使用redis進(jìn)行緩存,數(shù)據(jù)更新時(shí)刪除redis緩存;讀取時(shí)先讀取redis,緩存為空,讀取DB并存放redis; 該場(chǎng)景是使用redis當(dāng)緩存使用,存在一定風(fēng)險(xiǎn):由于數(shù)據(jù)量少并發(fā)高時(shí),成為熱點(diǎn)key會(huì)集中命中單個(gè)redis實(shí)例,流量上去后,性能會(huì)變差,甚至可能拖垮實(shí)例;

? ? ? 進(jìn)一步改進(jìn)本地JVM緩存加redis緩存,JVM緩存一分種失效,回源redis及數(shù)據(jù)庫(kù);存在集中穿透緩存回源數(shù)據(jù)庫(kù)拖垮應(yīng)用或數(shù)據(jù)庫(kù)情況,之前有過緩存失效,集中回源數(shù)據(jù)庫(kù)經(jīng)歷,結(jié)果應(yīng)用服務(wù)一臺(tái)臺(tái)倒下,數(shù)據(jù)庫(kù)沒有壓力;事后分析是數(shù)據(jù)庫(kù)配置最大連接數(shù)為10,外部請(qǐng)求超時(shí)時(shí)間為500ms,不斷有新請(qǐng)求進(jìn)來(lái),大量請(qǐng)求在等待連接!最后選擇在JVM使用ConcurrentMap存放當(dāng)DB使用,1分鐘異步刷新數(shù)據(jù);

? ? ? 在大促當(dāng)天,頁(yè)面該請(qǐng)求返回性能不太理想,數(shù)據(jù)返回大概73KB,使用Nginx增加gzip壓縮后,數(shù)據(jù)壓縮到13KB,性能提高不少;后續(xù)在Nginx增加代理緩存,性能穩(wěn)定;

2、類目中心設(shè)計(jì)

? ? ? 類目是電商領(lǐng)域最基礎(chǔ)數(shù)據(jù),使用依賴的系統(tǒng)很多很多,早期是各個(gè)系統(tǒng)直接從數(shù)據(jù)庫(kù)讀取并自行緩存使用,人為給數(shù)據(jù)庫(kù)增壓;為了避免該情況,著手搭建類目中心,對(duì)性能及穩(wěn)定要求是極致,類目中心服務(wù)異常不能影響使用方,類目更新后要及時(shí)同步給使用方;

? ? ? 經(jīng)過多次討論,確認(rèn)使用三級(jí)緩存:客戶端緩存、類目系統(tǒng)jvm緩存及統(tǒng)一redis緩存;

類目中心--讀

? ? ? 客戶端緩存:在對(duì)外提供api依賴包中進(jìn)行緩存封裝,通過調(diào)用類目系統(tǒng)接口提供緩存后的服務(wù)方法;緩存數(shù)據(jù)記錄失效時(shí)間,調(diào)用時(shí)發(fā)現(xiàn)緩存數(shù)據(jù)已失效時(shí),更新失效時(shí)間并返回,異步請(qǐng)求類目中心數(shù)據(jù)刷新;若緩存沒有命中,回源請(qǐng)求類目中心;客戶端會(huì)定時(shí)檢測(cè)類目版本信息,若版本更新變化,客戶端數(shù)據(jù)強(qiáng)制更新。

? ? ? 類目系統(tǒng)jvm緩存:使用jvm緩存,若有過期異步回源統(tǒng)一緩存redis,穿透直接回源redis;

? ? ? 統(tǒng)一緩存redis:當(dāng)DB使用,不回源數(shù)據(jù)庫(kù),并定時(shí)從數(shù)據(jù)庫(kù)把數(shù)據(jù)刷新至redis中;為了多個(gè)避免并發(fā)刷新,使用redis實(shí)現(xiàn)排它鎖,保證只一個(gè)任務(wù)刷新;

? ? ? 數(shù)據(jù)更新請(qǐng)求,有一定的規(guī)則:

? ? ? 1、更新數(shù)據(jù)庫(kù),保證數(shù)據(jù)庫(kù)是正確數(shù)據(jù),后續(xù)步驟異常也可通過定時(shí)全量更新彌補(bǔ);

? ? ? 2、更新redis緩存;

? ? ? 3、更新類目中心所有實(shí)例JVM緩存:由于系統(tǒng)是多實(shí)例集群,需要通知所有實(shí)例更新JVM緩存;

? ? ? 4、更新版本號(hào):用于客戶端查驗(yàn)強(qiáng)制更新標(biāo)識(shí);一定需要JVM更新完成之后,否則客戶端可能獲取到更新前的“錯(cuò)誤”數(shù)據(jù);

類目中心--更新

? ? ? 客戶端95%的請(qǐng)求被客戶端緩存命中,調(diào)用次數(shù)3700萬(wàn)/分鐘,性能TP999為1ms;

客戶端調(diào)用次數(shù)
客戶端性能

? ? ? 服務(wù)端請(qǐng)求次數(shù)3000萬(wàn)/分鐘也沒有壓力,單實(shí)例現(xiàn)實(shí)際調(diào)用次數(shù)150萬(wàn)/分鐘

服務(wù)端調(diào)用次數(shù)

最后

? ? ? 緩存不僅能當(dāng)緩存,也可以當(dāng)DB使用,避免穿透;

? ? ? 數(shù)據(jù)的更新分主動(dòng)緩存及被動(dòng)緩存;

? ? ? 需要解決數(shù)據(jù)的一致性及有效性;

? ? ? 如何使用,怎么組合,緩存什么數(shù)據(jù)都需要結(jié)合業(yè)務(wù)場(chǎng)景,也需要一步步觀察、總結(jié)才能優(yōu)化;

緩存更新內(nèi)存


面試內(nèi)存
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,326評(píng)論 2 89
  • 一周總結(jié): 定價(jià)調(diào)整偏見:如何在與顧客的交談中,占有話語(yǔ)權(quán),是一門很深刻的學(xué)問。 權(quán)利有限策略:只有縱觀全局,才能...
    臨淄茂業(yè)DDM王春梅閱讀 165評(píng)論 0 0
  • 早起的意愿增加了 呼吸的覺察,注意力還需要集中 動(dòng)作穩(wěn)定性,以及體位中自然記入屏氣部分。很多體位可以深入一些了。 ...
    雅音ClarityZhang閱讀 164評(píng)論 0 0
  • 盜火 | 蔡書騰 0717 遇到感知的浩瀚,無(wú)論是夜空中的星星或者是巨型視覺藝術(shù),都會(huì)觸發(fā)人的自我否定和時(shí)間停滯感...
    小新26閱讀 2,566評(píng)論 5 6

友情鏈接更多精彩內(nèi)容