1. 缓存基础概念与MyBatis缓存体系
1.1 缓存本质与价值
缓存本质上是用空间换时间的典型实践。作为存储在内存中的临时数据集合,其核心价值在于解决计算机系统中不同层级组件间的速度差异问题。在数据库访问场景中,磁盘I/O操作通常需要4-10ms,而内存访问仅需100ns左右,两者存在5个数量级的性能差距。
现代服务器内存配置普遍达到64GB-1TB规模,但相比动辄数十TB的数据库仍显有限。因此缓存策略需要遵循二八定律:将20%的热点数据存入缓存,就能解决80%的访问需求。这种选择性缓存机制在MyBatis中体现为细粒度的缓存控制策略。
1.2 MyBatis缓存体系结构
MyBatis采用二级缓存架构设计:
- 一级缓存(Local Cache):SqlSession级别的缓存,默认开启
- 二级缓存(Global Cache):Mapper级别的缓存,需显式配置
这种分层设计既保证了会话内的数据一致性,又提供了跨会话的数据共享能力。从实现上看,一级缓存直接使用HashMap存储,而二级缓存可通过多种缓存实现(如Ehcache、Redis)扩展。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 一级缓存深度解析
2.1 工作机制详解
一级缓存的生命周期与SqlSession严格绑定。当执行查询时,MyBatis会构建CacheKey作为唯一标识,其生成规则包括:
- Mapper方法ID(namespace + method)
- 分页参数(offset/limit)
- SQL语句本身
- 参数值列表
- 环境ID(environment)
这些要素通过哈希算法生成唯一键,确保相同查询条件能命中缓存。以下代码展示了CacheKey的生成过程:
java复制public class CacheKey implements Cloneable, Serializable {
private static final int DEFAULT_MULTIPLIER = 37;
private int hashcode;
private int count;
private List<Object> updateList;
public void update(Object object) {
int baseHashCode = object == null ? 1 : object.hashCode();
count++;
baseHashCode *= count;
hashcode = multiplier * hashcode + baseHashCode;
updateList.add(object);
}
}
2.2 缓存失效场景
一级缓
