一、redis&mybatis
Mybatsi默认缓存对象 PerpetualCache,是本地缓存
myBatis的缓存机制就是将【namespace/或者是dao名】作为key存储,然后将一个PerpetualCache作为一个value,而PerpetualCache是一个map集合,其key是【包含有namespace/或者dao名、以及sql语句】的一个长字符串,其value是sql语句查询结果。
当发生增删改操作,myBatis会刷新缓存,这样查询的时候是新的数据;而查询的时候优先从缓存获取数据,这样查询速度快,对硬盘压力也小。
我们可以【自定义Cache】,使之将缓存数据放到redis上,而非本地即可。
1.1 自定义缓存组件
Cache有很多,这里使用的是如下包下的Cache类
org.apache.ibatis.cache.Cache
根据业务场景,要在增加阶段设置有效期,与session不同,不会被刷新,而是到期即销毁
public class MyBatisCache implements Cache {
//id是mybatis创建此缓存组件的实例时,会传入的namespace
private String id;
//注意是final
private final ReadWriteLock lock = new ReentrantReadWriteLock();
public MyBatisCache() {
}
public MyBatisCache(String id) {
this.id = id;
}
@Override
public String getId() {
return this.id;
}
@Override
public void putObject(Object key, Object value) {
/**
* 该缓存组件不在工厂内,故不能注解方式获取,只能通过【ContextLoader】
* ContextLoader是在tomcat启动时就创建,然后再启动sqlSessionFactory
* 再扫描mapper后就会触发cache缓存,也就是说该类与工厂启动时刻一致
* 但是调用该方法的时候,工厂还未启动完全,所以会报错,因此只能用于局部变量,越靠后越好
*/
RedisTemplate<String,Object> template = (RedisTemplate<String, Object>) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
//将查询结果放入redis,缓存备用
//template.opsForValue().set(key.toString(), value);
//设置有效期一小时,意味着一小时后会销毁,这样保证数据安全,同时随时更新数据
template.opsForValue().set(key.toString(), value, 1, TimeUnit.HOURS);
}
@Override
public Object getObject(Object key) {
RedisTemplate<String,Object> template = (RedisTemplate<String, Object>) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
Object cache = template.opsForValue().get(key.toString());
if (cache != null) {
return cache;
} else {
return null;
}
}
//删除某一个缓存数据,一个namespace下有很多的key,不能一一删除,这里最好是用clear清空
@Override
public Object removeObject(Object key) {
return null;