SpringBoot+Redis+MemCache+Nginx+Lua實現三級緩存架構(一)——三級緩存架構體系

最近在學習整理軟件架構中的三級緩存架構,使用SpringBoot+Redis+MemCache+Nginx+Lua來實現該架構體系,來提高系統的併發訪問能力,該三級緩存架構主要適用於對請求併發量比較高的數據變動不是很大的業務場景

三級緩存架構

在博文開始的時候,這裏我們需要了解下本博文說的三級緩存架構是什麼?

首先確定一點,本博文中的三級緩存不是我們學硬件時的三級緩存,而是在軟件開發過程中,在互聯網的項目中,通常都是爲了解決某些特定業務場景中請求併發量比較大,與數據庫請求多的問題,爲了減少請求直接訪問數據庫的次數,通過降低訪問數據庫的次數來減輕數據庫的壓力,那如何減輕呢?

那就是使用緩存了,請求過來之後,先從緩存中查詢,如果緩存查詢到了,就直接返回,否則再從數據庫中加載最新的數據到緩存中,然後再返回給數據,這樣的話,維護好緩存就能解決數據庫的壓力了。

image

集成緩存需要考慮的問題

瞭解到了我們爲什麼要使用緩存,以及緩存能解決我們什麼樣的問題。但是使用緩存時也需要注意一些問題:

如果只是單純的整合Redis緩存,那麼可能出現如下的問題

  • 熱點數據的大量訪問,能對系統造成各種網絡開銷,影響系統的性能
  • 離散的數據的訪問,可以使用Redis緩存來支撐,但是一旦緩存發生雪崩了,或者緩存被擊穿了,能造成數據庫的壓力增大,可能會被打死,造成數據庫掛機狀態,進而造成服務宕機
  • 緩存雪崩,訪問全部打在數據庫上,數據庫也可能會被打死

爲了解決以上可能出現的問題,讓緩存層更穩定,健壯,我們使用三級緩存架構

  1. Nginx層緩存

對於高併發的請求,Nginx層有着巨大的作用,能反向代理,負載均衡,動靜分離以及和Lua整合,可以實現請求定向分發等非常有用的功能,同理Nginx層可以實現緩存的功能

在我們的三級緩存架構中,Nginx本地緩存,主要是用於承載熱數據的高併發訪問,在Nginx中通過其他技術的輔助,判斷哪些數據是熱點數據,然後將熱點數據緩存在Nginx本地緩存,當請求過來時,判斷本地緩存中是否存在,如果存在着直接返回請求結果(或者展現靜態資源的數據),這樣的請求不會直接發送到後端服務層,請求的併發量完全取決於Nginx的併發量

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

  1. Redis層緩存

當然,並不是所有的數據都是熱點數據,大部分還是一些離散數據,再加上Nginx層的數據也有失效時間,當Nginx層數據失效了,還得從服務中獲取最新的數據。

Redis有很多的優勢,支持分佈式大規模緩存,支持海量數據,高併發的訪問和高可用的服務,方便橫向擴展來擴大數據量,同時Redis可以配置高可用,對於系統的穩定性,有着不言而喻的優勢

  1. Tomcat堆緩存

Tomcat堆緩存,主要是抗Redis大規模災難,如果Redis出現大規模的宕機,導致Nginx請求直接湧入數據生產服務,name我們最後的Tomcat緩存至少可以再抗一下,不至於讓數據庫直接裸奔

同時tomcat jvm堆內存緩存,也可以抗住redis沒有cache住的最後那少量的部分緩存

image

  • 用戶請求過來,首先經過Nginx層,Nginx層這裏分爲雙層,一層作爲分發層,一層作爲應用層
  • 分發層集成Lua,來請求定向(針對同一請求固定打到某一服務上),另一層做數據緩存
  • 如果請求在Nginx的應用層找不到數據,則直接請求到後臺服務系統,服務系統到Redis緩存中查詢數據
  • Redis中請求到數據直接返回Nginx層,同時將數據緩存到Nginx層中
  • Redis中查詢不到數據,則從Tomcat堆緩存中查詢數據,如果查詢到則直接返回,同時將數據緩存到Reids和Nginx的緩存中
  • Tomcat堆緩存中查詢不到數據,則直接請求數據庫,然後返回,將數據緩存到Tomcat堆緩存、Redis緩存和Nginx緩存中
  • 這樣的話數據庫的壓力就會非常小了,再加上Ridis的QPS很高,所以整個服務的性能就比較好了

當然三級緩存架構模式只適用於數據變動不是很大,但請求併發量比較大的場景,針對數據變動變動的處理,可以參考我的博文 緩存與數據庫雙寫一致性的解決方案——附上代碼解決方案

下一篇博文我們再根據我們的三級緩存架構模型,來搭建我們需要的系統環境:搭建Nginx、Redis集羣、SpringBoot集成Memcache緩存以及數據庫安裝等,然後基於此環境來編碼實現簡單的場景交互功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章