首页 > 经验记录 > SpringBoot使用Redis做查询集中缓存(MyBatis二级缓存采用Redis配置)

SpringBoot使用Redis做查询集中缓存(MyBatis二级缓存采用Redis配置)

首先必须的配置:yml和pom.xml

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

 

#数据库连接属性配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/hospital?serverTimezone=Asia/Shanghai
    username: root
    password: 614
#security配置
  jackson:
    serialization:
      indent_output: true
#Redis配置
  redis:
    host: 127.0.0.1
    port: 6379
    #Redis连接池配置
    jedis:
      pool:
        min-idle: 0
        max-idle: 8
        max-active: 8
        max-wait: -1ms
#mybatis实体类名
mybatis:
  type-aliases-package: top.yibobo.hospital.domain
  configuration:
  #到下划线的表字段自动映射成驼峰命名法
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mybatis/mapper/*.xml
#设置服务器端口号/session保存时长
server:
  port: 8086
#定义日志文件路径
logging:
  file: logs/all.log
  level:
    org.springframework.security: info
    top.yibobo.hospital.mapper: debug
    top.yibobo.hospital.util: debug
#JWT配置
jwt:
  header: Authorization #请求头部属性名
  secret: mySecret #自定义口令
  expiration: 604800 #token失效时间
  route: #访问路径
      authentication:
        path: /auth
        refresh: /refresh

 
 
这个时候需要在总启动类的类上写上该注释:@EnableCaching,使用Redis缓存
然后写一个缓存类,实现MyBatis的二级缓存,就是实现org.apache.ibatis.cache.Cache类
我已经写好了,放上来吧:
最重要的类!!!

package top.yibobo.hospital.util;
import org.apache.ibatis.cache.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/*
使用Redis实现MyBatis的二级缓存
 */
public class RedisCache implements Cache{
    //日志记录器定义
    private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);
    //缓存对象唯一标识
    private final String id;
    //用于事务缓存对象的读写锁
    private static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    //用于将缓存对象写入Redis的模板对象
    private RedisTemplate redisTemplate;
    //缓存对象失效时间
    private static final long EXPRIRE_TIME_IN_MINUT=30;
    public RedisCache(String id){
        if (id==null){
            throw new IllegalArgumentException("缓存对象ID不能为空");
        }
        this.id = id;
    }
    @Override
    public String getId() {
        return this.id;
    }
    /*
        保存缓存对象的方法
     */
    @Override
    public void putObject(Object key, Object value) {
        try{
            RedisTemplate redisTemplate = getRedisTemplate();
            //得到值操作对象
            ValueOperations operations = redisTemplate.opsForValue();
            //通过值操作对象set缓存对象
            operations.set(key,value,EXPRIRE_TIME_IN_MINUT, TimeUnit.MINUTES);
            logger.debug("缓存对象保存成功啦!!!");
        }catch (Throwable t){
            logger.error("缓存对象保存失败"+t);
        }
    }
    /*
        获取缓存对象的方法
     */
    @Override
    public Object getObject(Object key) {
        try{
            RedisTemplate redisTemplate = getRedisTemplate();
            //得到值操作对象
            ValueOperations operations = redisTemplate.opsForValue();
            Object obj =  operations.get(key);
            logger.debug("获取缓存对象成功");
            return obj;
        }catch (Throwable t){
            logger.error("缓存对象获取失败"+t);
            return null;
        }
    }
    /*
        删除缓存对象
     */
    @Override
    public Object removeObject(Object key) {
        try{
            RedisTemplate redisTemplate = getRedisTemplate();
            redisTemplate.delete(key);
            logger.debug("删除缓存对象成功");
        }catch (Throwable t){
            logger.error("删除缓存对象失败"+t);
        }
        return null;
    }
    /*
        清空所有缓存对象
     */
    @Override
    public void clear() {
        RedisTemplate redisTemplate = getRedisTemplate();
        redisTemplate.execute((RedisCallback)collection ->{
            collection.flushDb();
            return null;
        });
        logger.debug("清空缓存对象成功~");
    }
    @Override
    public int getSize() {
        return 0;
    }
    @Override
    public ReadWriteLock getReadWriteLock(){
        return readWriteLock;
    }
    private RedisTemplate getRedisTemplate(){
        if (redisTemplate==null){
            redisTemplate = ApplicationContextHolder.getBean("redisTemplate");
        }
        return redisTemplate;
    }
}

 
此时弄完的话,可以说是已经大功告成了!!,可是还需要指定哪个东西需要使用
有两种方式:
 
第一种、在MyBatis使用注解配置的类上面定义类注解:
@CacheNamespace(implementation = 你写的缓存类.class)
这种只会在该类下已写好注解 Sql语句的(@Select)才会采用。该类下没有定义注解Sql的是不会使用Redis缓存的。
 
第二种、在对应类的Mapper.xml文件配置
加上一句话: type属性=写你写好的缓存类(全名)
比如:
<cache type=”top.yibobo.hospital.util.RedisCache” />
这种的Redis缓存只会生效在Mapper.xml中定义好的Sql语句上。
 
 
这两种各需所需。有的方法及时性要求比较强的(比如用户登陆、密码修改),最好别用缓存

           


CAPTCHAis initialing...
EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00