SpringBoot使用Redis做快取,MyBatis二級快取採用Redis
阿新 • • 發佈:2021-04-29
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語句上。