1,mybatis的缓存
首先我们要知道mybatis有一级缓存,和二级缓存的概念
1)、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构 (HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
2),级缓存是多个SqlSession共享的,是sqlSessionFactory级的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。
2,redis做mybatis的二级缓存的好处
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
3 mybatis的二级缓存的实现
通过配置文件 开启mybatis的二级缓存缓存
<configuration>
<!-- 配置mybatis的缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
写jedis工具类去操作redis
public class JedisUtil {
private static JedisPool jedisPool=null;
//加载连接池的配置文件
static{
//连接池配置对象
JedisPoolConfig poolConfig = new JedisPoolConfig();
//设置连接池的相关信息
//最大连接数
poolConfig.setMaxTotal(100);
//最大空闲连接
poolConfig.setMaxIdle(10);
//通过连接池做连接
jedisPool=new JedisPool(poolConfig, "192.168.12.135");
}
//获取jedis对象
public static Jedis getJedis(){
Jedis jedis = jedisPool.getResource();
return jedis;
}
//关闭jedis对象
public static void closeJedis(Jedis jedis){
if (jedis!=null) {
jedis.close();
}
}
实现Cache接口
写工具类实现mybatis的cache接口
public class RedisCache implements Cache {
private String id;
public void setId(String id){
this.id=id;
}
@Override
public void clear() {
// TODO Auto-generated method stub
}
public RedisCache(String id){
this.id=id;
}
@Override
public String getId() {
// TODO Auto-generated method stub
return id;
}
@Override
public Object getObject(Object key) {
Jedis jedis = JedisUtil.getJedis();
Object obj=null;
if (jedis.exists(SerializationUtils.serialize((Serializable)key))){
byte[] bs = jedis.get(SerializationUtils.serialize((Serializable)key));
//反序列化
obj = SerializationUtils.deserialize(bs);
}
JedisUtil.closeJedis(jedis);
return obj;
}
@Override
public ReadWriteLock getReadWriteLock() {
// TODO Auto-generated method stub
System.out.println("111");
return null;
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void putObject(Object key, Object value) {
Jedis jedis = JedisUtil.getJedis();
//让jedis保存数据
jedis.set(SerializationUtils.serialize((Serializable)key),SerializationUtils.serialize((Serializable)value));
//关闭连接
JedisUtil.closeJedis(jedis);
}
@Override
public Object removeObject(Object key) {
Jedis jedis = JedisUtil.getJedis();
Object obj=null;
if (jedis.exists(SerializationUtils.serialize((Serializable)key))) {
obj=jedis.del(SerializationUtils.serialize((Serializable)key));
}
return obj;
}
在需要用缓存的mapper文件中,加入cache标签
type为你实现cache接口的类全限定名
<cache type="com.eric.ddbg.utils.RedisCache" />
这样就简单实现了redis做mybatis的二级缓存