????????在 Java 開發的典型架構(結合前端、后端、MyBatis、MySQL 及緩存機制)中,緩存層次可以從前端到后端再到數據庫進行劃分,通常涉及以下多層緩存:
1.?前端緩存
- 瀏覽器緩存:瀏覽器自帶的緩存機制(如 HTTP 緩存,包括強緩存
Cache-Control
/Expires
和協商緩存ETag
/Last-Modified
),用于緩存靜態資源(JS、CSS、圖片等)。 - 前端應用緩存:前端框架(如 Vue、React)中的內存緩存(如 Vuex、Redux 狀態管理)、本地存儲(LocalStorage/SessionStorage),用于緩存接口數據或臨時狀態。
2.?后端緩存
- 網關 / 反向代理緩存:如 Nginx 緩存,可緩存靜態資源或頻繁訪問的 API 響應,減少后端服務壓力。
- 應用層緩存:
- 本地緩存:應用內存中的緩存(如 Java 的
HashMap
、Guava Cache、Caffeine),適用于單機部署或非分布式場景,速度最快。 - 分布式緩存:多機共享的緩存(如 Redis、Memcached),解決分布式系統中緩存一致性問題,常用于存儲熱點數據(如用戶會話、商品信息)。
- 本地緩存:應用內存中的緩存(如 Java 的
3.?MyBatis 框架緩存
????????MyBatis 自身提供兩級緩存,用于減少數據庫查詢次數:
- 一級緩存(SqlSession 緩存):默認開啟,緩存作用于單個
SqlSession
(會話)內,同一SqlSession
中多次執行相同 SQL 會復用緩存。 - 二級緩存(Mapper 緩存):需手動開啟(在 Mapper.xml 中配置
<cache/>
),緩存作用于Mapper
接口級別,多個SqlSession
可共享緩存,通常結合分布式緩存(如 Redis)使用以避免集群環境下的緩存不一致。
4.?數據庫緩存
- MySQL 查詢緩存(已廢棄):MySQL 8.0 前提供的查詢緩存(Query Cache),但因維護成本高、命中率低已被移除。
- InnoDB 緩存:
- Buffer Pool:InnoDB 的核心內存緩存,用于緩存表數據、索引、undo 日志等,減少磁盤 IO。
- Log Buffer:緩存 redo 日志,定期刷新到磁盤(
ib_logfile
),提高寫入性能。
- 操作系統緩存:MySQL 依賴的操作系統頁緩存(Page Cache),用于緩存磁盤文件內容,進一步減少物理 IO。
總結:緩存層數
????????從前端到數據庫,典型架構中涉及的緩存層次約為?7-9 層(具體取決于實際架構設計),核心緩存層級如下:
- 瀏覽器緩存
- 前端應用緩存
- 網關 / 反向代理緩存
- 應用本地緩存
- 分布式緩存
- MyBatis 一級緩存
- MyBatis 二級緩存
- MySQL InnoDB Buffer Pool
- 操作系統頁緩存
????????這些緩存從上層到下層依次作用,共同提升系統性能,減少底層數據庫的訪問壓力。實際開發中需根據業務場景設計合理的緩存策略,避免緩存穿透、擊穿、雪崩等問題。