前言
为了配个缓存我容易吗我….
最近在写一个个人项目, 用 Spring Boot 构建, 因为懒省事就用了 Myatis 和 MyBatis Generator 管理我的 SQL 语句. 昨天心血来潮想用缓存减轻数据库压力(因为某些特定页面信息量比较多,所以SQL查询比较慢). 想了想觉得还是不用 MyBatis 自带的二级缓存(HashMap 实现的, 感觉不是很好), 最后选择了 Redis 作为缓存方案.
但是 MyBatis 整合 Redis 这个东西, 网上的坑是真的多阿… 还都是相互抄的… 偏偏 MyBatis 的官方文档对于二级缓存这一部分资料又比较少, 基本上就是一笔带过. 因为还要肝项目,所以就直接 Baid/Google 各种解决方案, 最后还是在掘金找到了个能用的,下面附上参考链接
当然因为我是用的 MyBatis Generator, 所以生成的时候没法序列化, 翻了好久,最后才发现官方已经给了序列化的插件
开始
这里我附上 import, 缺的包自行下载. 另外,日志我使用的是 @Slf4j 注解,这个需要搭配 IDEA 的 Lombook插件使用(Eclipse我不确定有没有),如果不想安装的话可以自行参考上面我所附参考链接的日志写法
首先,我们需要实现 org.apache.ibatis.cache.Cache 类
1 | import lombok.extern.slf4j.Slf4j; |
需要注意的是,这里不能通过 @Autowire
的方式引用redisTemplate,因为RedisCache并不是Spring容器里的bean。所以我们需要手动地去调用容器的getBean方法来拿到这个bean,所以需要再创建一个类拿到 bean
1 | package cn.bestsort.bbslite.cache; |
序列化
当然, 光上面是不够的,还需要在 数据库的查询对象 里实现 Serializable
接口. 拿我项目中的 topic
类举例,需要像这样:
未实现 Serializable
1 |
|
实现后
1 | public class Topic implements Serializable { |
实现了 Serializable 接口后,我们可以在 xxxMapper.xml 中添加
MyBatis Generator
因为我用了 MyBatis Generator,所以不可能手动去写的, 这样每次重新生成 mapper 文件的时候我还得手动改,不存在的.
幸运的是,官方已经为我们提供了 自动序列化的插件,所以只需要添加插件就可以了. 在 generatorConfiguration
字段下的 context
里添加两个插件
1 | <!-- 序列化插件 --> |
然后再执行一次 mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
重新生成并覆盖生成的文件即可
测试
运行一下我的项目,下面这是第一次访问
第二次访问相同内容,可以在日志中看到缓存已经命中