redis做mybatis的二级缓存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eric_shaoqin/article/details/78310812

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的二级缓存

展开阅读全文

没有更多推荐了,返回首页