缓存机制:一二级缓存

一、一级缓存(SqlSession 级缓存)

  1. 开启状态

    • 默认自动开启,无需任何额外配置,也不能通过配置关闭,只能通过操作让其失效
  2. 作用域

    • 作用域为 SqlSession级别 ,缓存数据仅在当前SqlSession内有效,不同SqlSession之间完全隔离
  3. 核心特性

    • 缓存命中条件 :同一SqlSession内,执行SQL 语句 + 参数完全相同的查询,第二次及以后会直接读取缓存,不访问数据库
    • 缓存自动清空场景 :执行insert/update/delete写操作、SqlSession.commit()SqlSession.rollback()时,一级缓存会被自动清空,保证缓存与数据库数据一致性
    • 手动清空方式 :调用SqlSession.clearCache()方法可手动清空当前SqlSession的一级缓存
    • 序列化要求 :无,一级缓存存储在内存中,仅在SqlSession生命周期内有效,无需实体类实现Serializable接口

二、二级缓存(Mapper 级缓存)

  1. 开启状态

    • 默认关闭 ,需满足三个必要条件才能生效:

      1. 全局配置:settingscacheEnabled=true(默认值为true,若设为false会全局禁用二级缓存)
      2. Mapper 配置:在对应Mapper.xml中添加<cache/>标签(或使用注解@CacheNamespace
      3. 实体类要求:对应的实体类必须实现Serializable接口,否则缓存数据无法序列化存储
  2. 作用域

    • 作用域为 Mapper级别 ,按namespace隔离,不同namespace的 Mapper 缓存数据相互独立
    • 同一namespace的多个SqlSession可以共享二级缓存数据
  3. 核心特性

    • 数据写入时机 :二级缓存数据不会即时写入,需等SqlSession关闭后,一级缓存中的数据才会同步到二级缓存
    • 缓存清空规则 :执行insert/update/delete写操作时,当前namespace的二级缓存会被自动清空
    • 共享范围限制 :仅同一namespaceSqlSession可共享,跨namespace无法共享

三、 缓存读写流程

  1. 查询读取顺序(关键易错点)

    • 优先级:二级缓存 → 一级缓存 → 数据库
    • 流程:查询时先从当前namespace的二级缓存获取;未命中则从当前SqlSession的一级缓存获取;仍未命中则查询数据库,查询结果会先写入一级缓存,SqlSession关闭后同步到二级缓存
  2. 数据写入顺序

    • 数据库查询结果 → 一级缓存(即时写入) → 二级缓存(SqlSession关闭后写入)

四、缓存配置

  1. 二级缓存全局配置

    • 在 MyBatis 全局配置文件中,通过settings标签配置cacheEnabled

      复制代码
      <settings>
          <setting name="cacheEnabled" value="true"/>
      </settings>
    • name属性值为cacheEnabledvaluetrue表示开启全局二级缓存支持(默认true

  2. 二级缓存 Mapper 配置

    • Mapper.xml中添加<cache/>标签,可配置缓存淘汰策略(eviction)、刷新间隔(flushInterval)等属性

五、缓存设计原则与指标

  1. 缓存命中率

    • 衡量缓存有效性的核心指标,命中率越高,说明更多请求从缓存获取数据,系统性能越好
  2. 缓存的优缺点

    • 优点:降低数据库负载、提高系统响应速度、减少网络 IO 开销
    • 缺点:增加数据一致性风险,需通过缓存清空、过期时间等策略保证缓存与数据库一致
  3. 数据一致性保障

    • 写操作(insert/update/delete)会触发对应缓存的清空,避免脏数据读取

六、一级缓存 vs 二级缓存 核心对比表

对比维度 一级缓存 二级缓存
默认状态 自动开启 默认关闭
作用域 SqlSession 级别 Mapper (namespace) 级别
序列化要求 实体类需实现 Serializable
共享范围 仅当前 SqlSession 同一 namespace 的多 SqlSession
写入时机 查询后即时写入 SqlSession 关闭后写入
清空触发条件 写操作、commit/rollback 写操作
相关推荐
筱顾大牛2 小时前
什么是缓存?缓存的作用?成本?
缓存
Mr.朱鹏2 小时前
分布式-redis主从复制架构
java·spring boot·redis·分布式·缓存·架构·java-ee
程序员夏末2 小时前
【AI Agent基础 | 第四篇】Spring AI 集成与多模型支持
java·人工智能·spring·ai·ai agent
Mr.朱鹏2 小时前
分布式-redis哨兵模式架构
数据库·redis·分布式·spring·缓存·架构·java-ee
Max_uuc2 小时前
【内核心法】撞碎“内存墙”:高性能 C++ 中的缓存友好型设计与数据局部性进化
缓存
rannn_1112 小时前
【Redis|实战篇1】黑马点评|短信登录功能实现
java·redis·后端·缓存·项目
云存储小天使2 小时前
提效 77%:GooseFS 写缓存及其在自动驾驶数据处理中的应用
人工智能·缓存·自动驾驶
Accerlator2 小时前
Redis 学习
redis·学习·mybatis
Chan162 小时前
从生产到消费:Kafka 核心原理与实战指南
java·spring boot·分布式·spring·java-ee·kafka·消息队列