MyBatis 缓存机制深度解析:从 Cache 接口到装饰器模式
MyBatis 缓存是提升查询性能的核心组件,通过减少重复数据库访问,大幅降低系统开销。其缓存体系基于 Cache 接口构建,采用 装饰器模式 实现 “基础存储 + 功能增强” 的灵活扩展,同时通过 CacheKey 保证缓存键的唯一性。从 “缓存体系架构→Cache 接口与实现→CacheKey 生成逻辑→实战配置” 四个维度,彻底拆解 MyBatis 缓存的底层机制。
MyBatis 缓存体系总览
MyBatis 提供 两级缓存,本质上均基于 Cache 接口实现,核心区别在于 “作用范围” 和 “生命周期”:
| 缓存级别 | 作用范围 | 生命周期 | 默认状态 | 底层核心实现 | 典型场景 |
|---|---|---|---|---|---|
| 一级缓存 | SqlSession 内部(会话级) | 随 SqlSession 关闭而销毁 | 开启 | PerpetualCache(HashMap) |
同一会话内的重复查询(如单事务内多次查同一数据) |
| 二级缓存 | Mapper namespace(接口级) | 随 MyBatis 应用生命周期 | 关闭 | PerpetualCache + 装饰器(如 LRU 淘汰、序列化) |
跨会话的重复查询(如多用户查询同一商品信息) |
核心设计思想:装饰器模式
MyBatis 缓存的灵活性源于 装饰器模式:
- 基础组件:
PerpetualCache实现最基本的缓存存储(基于 HashMap),是所有缓存的 “底层容器”; - 装饰器组件:如
LruCache(LRU 淘汰)、BlockingCache(并发控制)、SerializedCache(序列化)等,通过包装PerpetualCache或其他装饰器,动态增强缓存功能; - 组合能力:可按需组合多个装饰器(如 “LRU 淘汰 + 序列化 + 日志”),满足复杂业务需求。
Cache 接口:缓存的标准定义
Cache 接口是 MyBatis 缓存的顶层规范,定义了缓存的 7 个核心行为,所有缓存实现类均需遵守该接口: