美文网首页
SpringBoot+Mybatis整合Redis实现二级缓存

SpringBoot+Mybatis整合Redis实现二级缓存

作者: Aeroball | 来源:发表于2019-12-25 22:05 被阅读0次

    一. redis与spring boot整合

    1. 添加pom依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency> 
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.7.0</version>
    </dependency>
    
    1. 代码中注入RedisTemplate使用即可
    @RequestMapping("/redis")
    @RestController
    public class RedisController {
    
        @Resource
        private RedisTemplate<String, Object> redisTemplate;
    
        @RequestMapping("/set")
        public Object set() {
    //        redisTemplate.opsForValue(); // opsForValue 就是之前操作字符串
    //        redisTemplate.opsForList(); //opsForList, 操作列表
    //        redisTemplate.opsForHash(); // hash(map)
    //        redisTemplate.opsForZSet(); // zset
    //        redisTemplate.opsForSet(); //set
    
            redisTemplate.opsForList().leftPushAll("users", "zhangsan", "lisi");
    
            return "success";   //set成功后直接进入redis客户端即可查看添加数据成功
        }
    
        @RequestMapping("/get")
        public Object get() {
            return redisTemplate.opsForList().range("users", 0, -1);
        }
    }
    

    二、 Mybatis二级缓存

    一级缓存,就算Sqlsession级别缓存,二级缓存就是SqlsessionFactory级别缓存

    2.1 缓存类的实现
    package com.zqh.cache;
    
    import com.zqh.config.ApplicationContextHolder;
    import org.apache.ibatis.cache.Cache;
    import org.springframework.data.redis.core.RedisTemplate;
    
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    /**
     * 1.使用@Component的方式,是spring的方式,会生成一个RedisCache的实例,纳入spring容器中,
     *    在这个容器中实例,是可以注入RedisTemplate。
     * 2.因为在每个mapper中,配置了二级缓存,对应的mapper会重新生成实例,生成的这个实例没有按照spring的规则来生成。
     *   所以这个类中加入了 @Resource @AutoWire都是无法获取。
     * 3.那么如何获取spring容器中的对象了?就需要先拿到spring容器,然后从容器中去手动取。
     */
    
    public class RedisCache implements Cache {  //要想使用Mybatis的二级缓存,必须要实现Cache接口
    
        private RedisTemplate<Object, Object> redisTemplate;
    
        private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    
        private String id;
    
        // id的作用是将不同的mapper作一个区分
        public RedisCache(String id) {
            this.id = id;
        }
    
        // 获取RedisTemplate
        private RedisTemplate<Object, Object> getRedisTemplate() {
            this.redisTemplate = ApplicationContextHolder.getRedisTemplate();
            return redisTemplate;
        }
    
        @Override
        public void putObject(Object key, Object value) {
            getRedisTemplate().opsForValue().set(key, value);
        }
    
        @Override
        public Object getObject(Object key) {
            return getRedisTemplate().opsForValue().get(key);
        }
    
        @Override
        public Object removeObject(Object key) {
            return getRedisTemplate().delete(key);
        }
    
        @Override
        public int getSize() {
            return 1;
        }
    
        @Override
        public String getId() {
            return this.id;
        }
    
        // 不用实现
        @Override
        public void clear() {
        }
    
        @Override
        public ReadWriteLock getReadWriteLock() {
            return this.reentrantReadWriteLock;
        }
    }
    
    2.2 获取ApplicationContext
    package com.zqh.config;
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    
    /**
     * spring提供了很多的接口 XXXXAware, 这一类的接口比较的特殊, 那么spring容器在启动的时候
     * 如果检测某个类实现了这一类接口,那么会去调用实现了该接口方法的实现。
     */
    @Component
    public class ApplicationContextHolder implements ApplicationContextAware {
    
        private static ApplicationContext applicationContext;
    
        // 该放方法会自动将spring容器的类 ApplicationContext, 传入给该方法。
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            ApplicationContextHolder.applicationContext = applicationContext;
        }
    
        // 从容器中获取RedisTemplate
        public static RedisTemplate getRedisTemplate() {
            return applicationContext.getBean("redisTemplate", RedisTemplate.class);
        }
    }
    
    2.3 mapper.xml配置
        <!--
           在这里配置缓存,那么每个Mapper都会去生成 RedisCache的实现类
         -->
         <!--
            flushInterval: 清空缓存的时间间隔,单位为毫秒; 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用更新语句时刷新。
            size: 可以被设置为任意正整数, 缓存的数量,默认是1024;
            evication: LRU 移除最长时间不被使用的对象。
            blocking: 默认是false;
         -->
        <cache size="1024" type="com.qf.cache.RedisCache"></cache>
    

    相关文章

      网友评论

          本文标题:SpringBoot+Mybatis整合Redis实现二级缓存

          本文链接:https://www.haomeiwen.com/subject/lruhoctx.html