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來(lái)實(shí)現(xiàn)該架構(gòu)體系,來(lái)提高系統(tǒng)的并發(fā)訪問(wèn)能力,該三級(jí)緩存架構(gòu)主要適用于對(duì)請(qǐng)求并發(fā)量比較高的數(shù)據(jù)變動(dòng)不是很大的業(yè)務(wù)場(chǎng)景

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

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

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

那就是使用緩存了,請(qǐng)求過(guò)來(lái)之后,先從緩存中查詢,如果緩存查詢到了,就直接返回,否則再?gòu)臄?shù)據(jù)庫(kù)中加載最新的數(shù)據(jù)到緩存中,然后再返回給數(shù)據(jù),這樣的話,維護(hù)好緩存就能解決數(shù)據(jù)庫(kù)的壓力了。

image

集成緩存需要考慮的問(wèn)題

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

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

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

為了解決以上可能出現(xiàn)的問(wè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ā)訪問(wèn),在Nginx中通過(guò)其他技術(shù)的輔助,判斷哪些數(shù)據(jù)是熱點(diǎn)數(shù)據(jù),然后將熱點(diǎn)數(shù)據(jù)緩存在Nginx本地緩存,當(dāng)請(qǐng)求過(guò)來(lái)時(shí),判斷本地緩存中是否存在,如果存在著直接返回請(qǐng)求結(jié)果(或者展現(xiàn)靜態(tài)資源的數(shù)據(jù)),這樣的請(qǐng)求不會(huì)直接發(fā)送到后端服務(wù)層,請(qǐng)求的并發(fā)量完全取決于Nginx的并發(fā)量

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

  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èn)和高可用的服務(wù),方便橫向擴(kuò)展來(lái)擴(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ù)庫(kù)直接裸奔

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

image
  • 用戶請(qǐng)求過(guò)來(lái),首先經(jīng)過(guò)Nginx層,Nginx層這里分為雙層,一層作為分發(fā)層,一層作為應(yīng)用層
  • 分發(fā)層集成Lua,來(lái)請(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ù)庫(kù),然后返回,將數(shù)據(jù)緩存到Tomcat堆緩存、Redis緩存和Nginx緩存中
  • 這樣的話數(shù)據(jù)庫(kù)的壓力就會(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ù)庫(kù)雙寫(xiě)一致性的解決方案——附上代碼解決方案

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

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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