MyBatis二级缓存默认基于JVM内存,仅单机有效;分布式场景需替换为Redis(天然支持共享)或EhCache(需额外配置才可伪分布),推荐Redis方案——引入mybatis-redis依赖,Mapper中配置<cache type="RedisCache"/>,结合redis.properties即可实现跨节点缓存一致。

MyBatis 自带的二级缓存是基于 JVM 堆内存的,只在单个应用实例内有效;多节点部署时缓存无法共享,容易出现数据不一致。要支持分布式场景,必须接入第三方缓存组件,Redis 和 EhCache 是两种主流选择——但二者定位不同:Redis 是独立进程、天然分布式;EhCache 默认本地,需额外配置(如 RMI 或 Terracotta)才能跨节点同步,实际项目中更常用于单机增强。
用 Redis 替换 MyBatis 二级缓存(推荐分布式场景)
核心思路是让 MyBatis 的 Cache 接口实现委托给 Redis,官方提供了 mybatis-redis 模块,也支持自定义实现(如基于 Redisson 或 Spring Data Redis)。
- 添加依赖:
org.mybatis.caches:mybatis-redis:1.0.0-beta2(兼容 MyBatis 3.4+)或手动引入spring-boot-starter-data-redis+ 自定义Cache实现类 - 全局开启二级缓存:
mybatis.configuration.cache-enabled=true(Spring Boot 配置项) - Mapper XML 中声明缓存类型:
<cache type="org.mybatis.caches.redis.RedisCache"/> - 提供
redis.properties或通过@Configuration注入JedisConnectionFactory/RedissonClient,确保连接可用 - 注意序列化:RedisCache 默认使用 JDK 序列化,建议改用 JSON(如 Jackson)避免
NotSerializableException
用 EhCache 作为二级缓存(适合单机或简单集群)
EhCache 是纯 Java 实现,嵌入在应用进程中,启动快、无额外运维成本,但默认不具备分布式能力。若仅需提升单机查询性能,它比 Redis 更轻量。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 引入依赖:
org.mybatis.caches:mybatis-ehcache:1.2.2+net.sf.ehcache:ehcache:2.10.9.2 - 在
resources/下添加ehcache.xml,配置内存大小、过期策略、磁盘备份等 - Mapper XML 中启用:
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/> - 确保日志桥接正常(如 slf4j + log4j2),EhCache 运行时会输出缓存命中率等信息
- 如需伪分布式(非强一致性),可启用 EhCache 的 RMI 复制或使用
terracotta模块,但复杂度和维护成本明显上升
关键区别与选型建议
不要把两者当成简单互换项。Redis 是服务级缓存,适合读多写少、要求高一致性、跨语言调用的场景;EhCache 是库级缓存,适合低延迟敏感、对缓存强一致性要求不高、或已有成熟 EhCache 运维体系的老系统。
立即学习“Java免费学习笔记(深入)”;
- 有 Redis 基础设施?直接上 RedisCache,5 分钟完成集成,天然支持集群、哨兵、分片
- 纯内网小系统、无中间件运维能力?EhCache 更省心,
ehcache.xml几行配完就能用 - 需要两级缓存(本地 + 远程)?可组合使用:一级用 Caffeine(替代 MyBatis 一级缓存),二级用 Redis
- 注意事务边界:MyBatis 二级缓存会在执行
INSERT/UPDATE/DELETE时自动清空同 namespace 下所有缓存,但跨 service 修改数据时需手动cache.clear()或用事件机制同步
验证是否生效
最直接的方式是开启 MyBatis SQL 日志(logging.level.org.apache.ibatis=DEBUG),观察相同查询第二次是否跳过 JDBC 执行;再查 Redis CLI 或 EhCache 管理控制台确认数据写入。
- Redis 方案:执行
redis-cli KEYS "org.mybatis.caches.redis.RedisCache.*"查看 key 是否存在 - EhCache 方案:访问
http://localhost:8080/ehcache/status(需暴露 Actuator 端点)或打印CacheManager.getInstance().getCacheNames() - 缓存穿透风险:MyBatis 二级缓存默认不处理空结果,建议在 Service 层对 null 查询结果做短时缓存(如 2 分钟),避免反复击穿

















