mybatis的缓存分为以及缓存和二级缓存,默认情况下,一级缓存是进城内的,和sqlsession进行绑定的,sqlsessoin关闭,缓存也就失效了,二级缓存是可以扩展使用第三方的缓存机制,如ehcache,memcache和redis。
这里就介绍一下怎么使用redis作为mybatis的二级缓存。
官方的支持
mybatis官方有出品对应的mybatis-redis
组件,使用时很简单:
maven依赖项
<dependencies> |
mybatis-mapper文件
在mapper文件里,添加对于的cache支持即可,如下:
<?xml version="1.0" encoding="UTF-8" ?> |
说明
这种支持比较简单,对应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
来检查对应的过期时间了
参考
- http://edwin.baculsoft.com/2015/05/a-simple-mybatis-caching-using-redis/
- http://moi.vonos.net/java/mybatis-caching/
- http://www.iteye.com/topic/1112327
- http://www.cnblogs.com/fangjian0423/p/mybatis-cache.html
如果想要对key作一些调整,可以参考下面内容: