SpringBoot使用Redis做缓存,MyBatis二级缓存采用Redis

5 篇文章 0 订阅
本文介绍了如何在Spring Boot项目中集成Redis作为缓存,并展示了如何在MyBatis中实现二级缓存,包括添加`@EnableCaching`注解、RedisCache实现以及两种缓存配置方法:注解和Mapper.xml。
摘要由CSDN通过智能技术生成

gradle依赖

    compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.1.0.RELEASE'

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类
在这里插入图片描述

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属性=写你写好的缓存类(全名)
比如:

这种的Redis缓存只会生效在Mapper.xml中定义好的Sql语句上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acmen-zym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值