SpringBoot+Redis+MemCache+Nginx+Lua實(shí)現(xiàn)三級(jí)緩存架構(gòu)(一)——三級(jí)緩存架構(gòu)體系

最近在學(xué)習(xí)整理軟件架構(gòu)中的三級(jí)緩存架構(gòu)脸侥,使用SpringBoot+Redis+MemCache+Nginx+Lua來實(shí)現(xiàn)該架構(gòu)體系镜沽,來提高系統(tǒng)的并發(fā)訪問能力茵乱,該三級(jí)緩存架構(gòu)主要適用于對(duì)請(qǐng)求并發(fā)量比較高的數(shù)據(jù)變動(dòng)不是很大的業(yè)務(wù)場(chǎng)景

三級(jí)緩存架構(gòu)

在博文開始的時(shí)候,這里我們需要了解下本博文說的三級(jí)緩存架構(gòu)是什么搜变?

首先確定一點(diǎn)采缚,本博文中的三級(jí)緩存不是我們學(xué)硬件時(shí)的三級(jí)緩存,而是在軟件開發(fā)過程中挠他,在互聯(lián)網(wǎng)的項(xiàng)目中扳抽,通常都是為了解決某些特定業(yè)務(wù)場(chǎng)景中請(qǐng)求并發(fā)量比較大,與數(shù)據(jù)庫請(qǐng)求多的問題殖侵,為了減少請(qǐng)求直接訪問數(shù)據(jù)庫的次數(shù)贸呢,通過降低訪問數(shù)據(jù)庫的次數(shù)來減輕數(shù)據(jù)庫的壓力,那如何減輕呢拢军?

那就是使用緩存了楞陷,請(qǐng)求過來之后,先從緩存中查詢茉唉,如果緩存查詢到了固蛾,就直接返回结执,否則再從數(shù)據(jù)庫中加載最新的數(shù)據(jù)到緩存中,然后再返回給數(shù)據(jù)魏铅,這樣的話昌犹,維護(hù)好緩存就能解決數(shù)據(jù)庫的壓力了。

image

集成緩存需要考慮的問題

了解到了我們?yōu)槭裁匆褂镁彺胬婪迹约熬彺婺芙鉀Q我們什么樣的問題。但是使用緩存時(shí)也需要注意一些問題:

如果只是單純的整合Redis緩存鸿竖,那么可能出現(xiàn)如下的問題

  • 熱點(diǎn)數(shù)據(jù)的大量訪問沧竟,能對(duì)系統(tǒng)造成各種網(wǎng)絡(luò)開銷,影響系統(tǒng)的性能
  • 離散的數(shù)據(jù)的訪問缚忧,可以使用Redis緩存來支撐悟泵,但是一旦緩存發(fā)生雪崩了,或者緩存被擊穿了闪水,能造成數(shù)據(jù)庫的壓力增大糕非,可能會(huì)被打死,造成數(shù)據(jù)庫掛機(jī)狀態(tài)球榆,進(jìn)而造成服務(wù)宕機(jī)
  • 緩存雪崩朽肥,訪問全部打在數(shù)據(jù)庫上,數(shù)據(jù)庫也可能會(huì)被打死

為了解決以上可能出現(xiàn)的問題持钉,讓緩存層更穩(wěn)定衡招,健壯,我們使用三級(jí)緩存架構(gòu)

  1. Nginx層緩存

對(duì)于高并發(fā)的請(qǐng)求每强,Nginx層有著巨大的作用始腾,能反向代理,負(fù)載均衡空执,動(dòng)靜分離以及和Lua整合浪箭,可以實(shí)現(xiàn)請(qǐng)求定向分發(fā)等非常有用的功能,同理Nginx層可以實(shí)現(xiàn)緩存的功能

在我們的三級(jí)緩存架構(gòu)中辨绊,Nginx本地緩存奶栖,主要是用于承載熱數(shù)據(jù)的高并發(fā)訪問,在Nginx中通過其他技術(shù)的輔助邢羔,判斷哪些數(shù)據(jù)是熱點(diǎn)數(shù)據(jù)驼抹,然后將熱點(diǎn)數(shù)據(jù)緩存在Nginx本地緩存,當(dāng)請(qǐng)求過來時(shí)拜鹤,判斷本地緩存中是否存在框冀,如果存在著直接返回請(qǐng)求結(jié)果(或者展現(xiàn)靜態(tài)資源的數(shù)據(jù)),這樣的請(qǐng)求不會(huì)直接發(fā)送到后端服務(wù)層敏簿,請(qǐng)求的并發(fā)量完全取決于Nginx的并發(fā)量

其次明也,Nginx層也可以通過自身的策略配置宣虾,可以過濾一些惡意請(qǐng)求,或者限制某些IP的訪問都是有些不小的作用

  1. Redis層緩存

當(dāng)然温数,并不是所有的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)绣硝,大部分還是一些離散數(shù)據(jù),再加上Nginx層的數(shù)據(jù)也有失效時(shí)間撑刺,當(dāng)Nginx層數(shù)據(jù)失效了鹉胖,還得從服務(wù)中獲取最新的數(shù)據(jù)。

Redis有很多的優(yōu)勢(shì)够傍,支持分布式大規(guī)模緩存甫菠,支持海量數(shù)據(jù),高并發(fā)的訪問和高可用的服務(wù)冕屯,方便橫向擴(kuò)展來擴(kuò)大數(shù)據(jù)量寂诱,同時(shí)Redis可以配置高可用,對(duì)于系統(tǒng)的穩(wěn)定性安聘,有著不言而喻的優(yōu)勢(shì)

  1. Tomcat堆緩存

Tomcat堆緩存痰洒,主要是抗Redis大規(guī)模災(zāi)難,如果Redis出現(xiàn)大規(guī)模的宕機(jī)浴韭,導(dǎo)致Nginx請(qǐng)求直接涌入數(shù)據(jù)生產(chǎn)服務(wù)丘喻,name我們最后的Tomcat緩存至少可以再抗一下,不至于讓數(shù)據(jù)庫直接裸奔

同時(shí)tomcat jvm堆內(nèi)存緩存囱桨,也可以抗住redis沒有cache住的最后那少量的部分緩存

image
  • 用戶請(qǐng)求過來仓犬,首先經(jīng)過Nginx層,Nginx層這里分為雙層舍肠,一層作為分發(fā)層搀继,一層作為應(yīng)用層
  • 分發(fā)層集成Lua,來請(qǐng)求定向(針對(duì)同一請(qǐng)求固定打到某一服務(wù)上)翠语,另一層做數(shù)據(jù)緩存
  • 如果請(qǐng)求在Nginx的應(yīng)用層找不到數(shù)據(jù)叽躯,則直接請(qǐng)求到后臺(tái)服務(wù)系統(tǒng),服務(wù)系統(tǒng)到Redis緩存中查詢數(shù)據(jù)
  • Redis中請(qǐng)求到數(shù)據(jù)直接返回Nginx層肌括,同時(shí)將數(shù)據(jù)緩存到Nginx層中
  • Redis中查詢不到數(shù)據(jù)点骑,則從Tomcat堆緩存中查詢數(shù)據(jù),如果查詢到則直接返回谍夭,同時(shí)將數(shù)據(jù)緩存到Reids和Nginx的緩存中
  • Tomcat堆緩存中查詢不到數(shù)據(jù)黑滴,則直接請(qǐng)求數(shù)據(jù)庫,然后返回紧索,將數(shù)據(jù)緩存到Tomcat堆緩存袁辈、Redis緩存和Nginx緩存中
  • 這樣的話數(shù)據(jù)庫的壓力就會(huì)非常小了,再加上Ridis的QPS很高珠漂,所以整個(gè)服務(wù)的性能就比較好了

當(dāng)然三級(jí)緩存架構(gòu)模式只適用于數(shù)據(jù)變動(dòng)不是很大晚缩,但請(qǐng)求并發(fā)量比較大的場(chǎng)景尾膊,針對(duì)數(shù)據(jù)變動(dòng)變動(dòng)的處理,可以參考我的博文 緩存與數(shù)據(jù)庫雙寫一致性的解決方案——附上代碼解決方案

下一篇博文我們?cè)俑鶕?jù)我們的三級(jí)緩存架構(gòu)模型荞彼,來搭建我們需要的系統(tǒng)環(huán)境:搭建Nginx冈敛、Redis集群、SpringBoot集成Memcache緩存以及數(shù)據(jù)庫安裝等鸣皂,然后基于此環(huán)境來編碼實(shí)現(xiàn)簡(jiǎn)單的場(chǎng)景交互功能

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抓谴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寞缝,更是在濱河造成了極大的恐慌齐邦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件第租,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡我纪,警方通過查閱死者的電腦和手機(jī)慎宾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浅悉,“玉大人趟据,你說我怎么就攤上這事∈踅。” “怎么了汹碱?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)荞估。 經(jīng)常有香客問我咳促,道長(zhǎng),這世上最難降的妖魔是什么勘伺? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任跪腹,我火速辦了婚禮,結(jié)果婚禮上飞醉,老公的妹妹穿的比我還像新娘冲茸。我一直安慰自己,他們只是感情好缅帘,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布轴术。 她就那樣靜靜地躺著,像睡著了一般钦无。 火紅的嫁衣襯著肌膚如雪逗栽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天铃诬,我揣著相機(jī)與錄音祭陷,去河邊找鬼苍凛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兵志,可吹牛的內(nèi)容都是我干的醇蝴。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼想罕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悠栓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起按价,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤惭适,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后楼镐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癞志,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年框产,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凄杯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秉宿,死狀恐怖戒突,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情描睦,我是刑警寧澤膊存,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站忱叭,受9級(jí)特大地震影響隔崎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窑多,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一仍稀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧埂息,春花似錦技潘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拾弃,卻和暖如春值桩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豪椿。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工奔坟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留携栋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓咳秉,卻偏偏與公主長(zhǎng)得像婉支,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子澜建,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容