应用开发使用缓存

在 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. 操作系统页缓存

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

相关推荐
升鲜宝供应链及收银系统源代码服务6 小时前
升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现
java·开发语言·数据库·redis·缓存·开源·供应链系统
苦学编程的谢7 小时前
Redis_8_List
数据库·redis·缓存
一个不称职的程序猿9 小时前
高并发场景下的缓存利器
java·缓存
java1234_小锋12 小时前
REDIS集群会有写操作丢失吗?为什么
数据库·redis·缓存
hzk的学习笔记16 小时前
Redisson 的 Watchdog 机制
数据库·redis·分布式·缓存
hzk的学习笔记18 小时前
Redisson解锁失败,watchdog会不会一直续期下去?
数据库·redis·缓存
ckm紫韵18 小时前
redis查询速度快的原因?
数据库·redis·缓存
JanelSirry1 天前
缓存击穿,缓存穿透,缓存雪崩的原因和解决方案(或者说使用缓存的过程中有没有遇到什么问题,怎么解决的)
缓存
我命由我123452 天前
Java 并发编程 - Delay(Delayed 概述、Delayed 实现、Delayed 使用、Delay 缓存实现、Delayed 延迟获取数据实现)
java·开发语言·后端·缓存·java-ee·intellij-idea·intellij idea
北城以北88882 天前
SSM--MyBatis框架之缓存
java·缓存·intellij-idea·mybatis