1. 程式人生 > 其它 >SpringBoot使用Redis做快取,MyBatis二級快取採用Redis

SpringBoot使用Redis做快取,MyBatis二級快取採用Redis

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語句上。