应用开发使用缓存
在 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
- 操作系统页缓存
这些缓存从上层到下层依次作用,共同提升系统性能,减少底层数据库的访问压力。实际开发中需根据业务场景设计合理的缓存策略,避免缓存穿透、击穿、雪崩等问题。