Java干貨分享!
對于一個大型的數(shù)據(jù)緩存系統(tǒng),我們通常會部署多層的緩存服務(wù)以達(dá)到高并發(fā)、高可用的需求
1.多層緩存架構(gòu)
nginx本地緩存+redis分布式緩存+tomcat單機(jī)緩存的多級緩存架構(gòu)

nginx+lua腳本做頁面動態(tài)生成的工作,每次請求過來,優(yōu)先從nginx本地緩存中提取各種數(shù)據(jù),結(jié)合頁面模板,生成需要的頁面
如果nginx本地緩存過期了,那么就從nginx到redis中去拉取數(shù)據(jù),更新到nginx本地
如果redis中的緩存也被緩存淘汰策略淘汰掉了,那么就從nginx走h(yuǎn)ttp接口到后端的服務(wù)中拉取數(shù)據(jù),數(shù)據(jù)生產(chǎn)服務(wù)中,先在本地tomcat里的jvm堆緩存中找,比如Ehcache
如果ehcache中的數(shù)據(jù)也被清理掉了,那么就重新發(fā)送請求到源頭的服務(wù)中去拉取數(shù)據(jù),然后再次更新tomcat堆內(nèi)存緩存+redis緩存,并返回數(shù)據(jù)給nginx,nginx緩存到本地
更多Java知識,請點(diǎn)擊:https://www.bilibili.com/video/BV1D54y1s7cj
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1rp4y1W7ug
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1Ay4y127Ri
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1cy4y1n7Qf
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1R54y1a7Cv
2.緩存數(shù)據(jù)的類型
對時效性要求較高的數(shù)據(jù):庫存,價格,折扣信息等
一般來說,顯示的庫存,都是時效性要求會相對高一些,因?yàn)殡S著商品的不斷的交易,庫存會不斷的變化當(dāng)庫存變化的時候,盡可能更快將庫存顯示到頁面上去,而不是說等了很長時間,庫存才顯示到頁面上去
對時效性要求不高的數(shù)據(jù):商品的基本信息(名稱、顏色、版本、規(guī)格參數(shù),等等)
時效性要求不高的數(shù)據(jù),比如說現(xiàn)在改變了商品的名稱,稍微晚個幾分鐘反應(yīng)到商品頁面上,也還能接受
更多Java知識,請點(diǎn)擊:https://www.bilibili.com/video/BV1D54y1s7cj
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1rp4y1W7ug
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1Ay4y127Ri
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1cy4y1n7Qf
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1R54y1a7Cv
2.1.對于不同數(shù)據(jù)的處理
商品價格/庫存等時效性要求高的數(shù)據(jù),而且種類較少,采取相關(guān)的服務(wù)系統(tǒng)每次發(fā)生了變更的時候,直接采取?數(shù)據(jù)庫和redis緩存雙寫?的方案,這樣緩存的時效性最高
商品基本信息等時效性不高的數(shù)據(jù),而且種類繁多,來自多種不同的系統(tǒng),采取MQ異步通知的方式,寫一個數(shù)據(jù)生產(chǎn)服務(wù),監(jiān)聽MQ消息,然后異步拉取服務(wù)的數(shù)據(jù),更新tomcat jvm緩存+redis緩存
更多Java知識,請點(diǎn)擊:https://www.bilibili.com/video/BV1D54y1s7cj
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1rp4y1W7ug
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1Ay4y127Ri
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1cy4y1n7Qf
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1R54y1a7Cv
3.三層緩存中每一層緩存的意義
nginx本地緩存:抗住是熱數(shù)據(jù)的高并發(fā)訪問,一般來說,商品的購買總是有熱點(diǎn)的,比如每天購買iphone、nike、海爾等知名品牌的東西的人,總是比較多的
這些熱數(shù)據(jù),利用nginx本地緩存,由于經(jīng)常被訪問,所以可以被鎖定在nginx的本地緩存內(nèi)
大量的熱數(shù)據(jù)的訪問,就是經(jīng)常會訪問的那些數(shù)據(jù),就會被保留在nginx本地緩存內(nèi),那么對這些熱數(shù)據(jù)的大量訪問,就直接走nginx就可以了
那么大量的訪問,直接就可以走到nginx就行了,不需要走后續(xù)的各種網(wǎng)絡(luò)開銷了
redis分布式大規(guī)模緩存,抗的是很高的離散訪問,支撐海量的數(shù)據(jù),高并發(fā)的訪問,高可用的服務(wù)
redis緩存最大量的數(shù)據(jù),最完整的數(shù)據(jù)和緩存; nginx本地內(nèi)存有限,也就能cache住部分熱數(shù)據(jù),除了各種iphone、nike等熱數(shù)據(jù),其他相對不那么熱的數(shù)據(jù),可能流量會經(jīng)常走到redis那里,redis可以做到全量數(shù)據(jù)的緩存,并且可以通過水平擴(kuò)展利用redis cluster的多master寫入提升并發(fā)、高可用的能力。
tomcat jvm堆內(nèi)存緩存,主要是抗redis大規(guī)模災(zāi)難的,如果redis出現(xiàn)了大規(guī)模的宕機(jī),導(dǎo)致nginx大量流量直接涌入數(shù)據(jù)生產(chǎn)服務(wù),那么最后的tomcat堆內(nèi)存緩存至少可以再抗一下,不至于讓數(shù)據(jù)庫直接裸奔
同時tomcat jvm堆內(nèi)存緩存,也可以抗住redis沒有cache住的最后那少量的部分緩存
更多Java知識,請點(diǎn)擊:https://www.bilibili.com/video/BV1D54y1s7cj
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1rp4y1W7ug
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1Ay4y127Ri
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1cy4y1n7Qf
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://www.bilibili.com/video/BV1R54y1a7Cv
作者:幼兒園惡霸
鏈接:https://juejin.cn/post/6931354119626031118
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。