mybatis的缓存分为以及缓存和二级缓存,默认情况下,一级缓存是进城内的,和sqlsession进行绑定的,sqlsessoin关闭,缓存也就失效了,二级缓存是可以扩展使用第三方的缓存机制,如ehcache,memcache和redis。

这里就介绍一下怎么使用redis作为mybatis的二级缓存。

官方的支持

mybatis官方有出品对应的mybatis-redis组件,使用时很简单:

maven依赖项

<dependencies>
...
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
...
</dependencies>

mybatis-mapper文件

在mapper文件里,添加对于的cache支持即可,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.edw.mybatisredisexample.mapper.TestingMapper2" >

<cache type="org.mybatis.caches.redis.RedisCache" />

<select resultType="java.util.Map" id="select" >
SELECT * FROM testing
</select>
</mapper>

说明

这种支持比较简单,对应mybatis数据在redis里的存储也是按照mapper namespace为单位,每一个namespace会对应于mybatis里一个hashmap的数据结构。

缺点:

  • 没有办法对具体的缓存任何的缓存过期策略,实际项目中,往往需要对不同的数据设置不一样的缓存过期时间。

扩展实现

基于上面考虑,我在官方实现上作了一些修改,具体代码参见github

改动点

  • 把在redis里缓存的数据扁平化,全部用key-value的方式存储,不再使用hashmap结构
  • 利用redis的ttl来对具体每一个缓存记录进行区别缓存
  • 过期时间的设置还是按照mapper的namespace为单元,也就是说一个namespace下面将会使用一样的缓存过期时间,这里时基于一个假设:一个mapper下面是同一类数据,同一类数据的过期时间和敏感程度应该是一样的

如何使用

使用时mapper保持不变,在设置过期时间时,通过redis.properties文件进行设置,默认的缓存是永远不过期的,如果要控制过期的时间,则需要在redis.properties文件中添加下面代码:

host=localhost
port=6379
connectionTimeout=5000
soTimeout=4000
password=
database=0
com.edw.mybatisredisexample.mapper.TestingMapper=5 # 这里控制namespace对应的过期时间为5分钟过期

这样就可以在redis-cli里通过ttl key来检查对应的过期时间了

参考

如果想要对key作一些调整,可以参考下面内容: