应用开发使用缓存

在 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),解决分布式系统中缓存一致性问题,常用于存储热点数据(如用户会话、商品信息)。

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 层(具体取决于实际架构设计),核心缓存层级如下:

  1. 浏览器缓存
  2. 前端应用缓存
  3. 网关 / 反向代理缓存
  4. 应用本地缓存
  5. 分布式缓存
  6. MyBatis 一级缓存
  7. MyBatis 二级缓存
  8. MySQL InnoDB Buffer Pool
  9. 操作系统页缓存

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

相关推荐
2301_7819130512 小时前
关于缓存的一些思考?
缓存
LQ深蹲不写BUG13 小时前
Redis的五种常用数据类型。
数据库·redis·缓存
百思可瑞教育1 天前
前端性能优化:请求和响应优化(HTTP缓存与CDN缓存)
前端·网络协议·http·缓存·性能优化·北京百思可瑞教育·百思可瑞教育
chillxiaohan1 天前
GO学习记录九——数据库触发器的使用+redis缓存策略
数据库·缓存·golang
小钻风33661 天前
Redis初阶学习
数据库·redis·缓存
前端达人1 天前
从 useEffect 解放出来!异步请求 + 缓存刷新 + 数据更新,React Query全搞定
前端·javascript·react.js·缓存·前端框架
啥都不懂的小小白2 天前
微服务多级缓存:从问题到实战(小白也能看懂的亿级流量方案)
缓存·微服务·架构
xzl042 天前
pip的缓存
缓存·pip
知彼解己2 天前
Redis 集群模式与高可用机制
数据库·redis·缓存