SpringBoot使用快取
前言
我們都知道,一個程式的瓶頸通常都在資料庫,很多場景需要獲取相同的資料。比如網站頁面資料等,需要一次次的請求資料庫,導致大部分時間都浪費在資料庫查詢和方法呼叫上,這時就可以利用到快取來緩解這個問題。
本文來介紹SpringBoot來簡單整合快取,使用SpringBoot+JPA+mysql來進行資料庫操作。整合JPA的文章,具體可以參考 。
建立一個專案,pom檔案中加入spring-boot-starter-cache依賴,完整pom如下:
4.0.0 com.dalaoyang springboot_cache 0.0.1-SNAPSHOT jar springboot_cache springboot_cache org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE <!-- lookup parent from repository --> UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-cache org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
配置檔案如下,和整合JPA一樣,沒有做任何修改:
##埠號 server.port=8888 ##資料庫配置 ##資料庫地址 spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false ##資料庫使用者名稱 spring.datasource.username=root ##資料庫密碼 spring.datasource.password=root ##資料庫驅動 spring.datasource.driver-class-name=com.mysql.jdbc.Driver ##validate 載入hibernate時,驗證建立資料庫表結構 ##create 每次載入hibernate,重新建立資料庫表結構,這就是導致資料庫表資料丟失的原因。 ##create-drop 載入hibernate時建立,退出是刪除表結構 ##update 載入hibernate自動更新資料庫結構 ##validate 啟動時驗證表的結構,不會建立表 ##none 啟動時不做任何操作 spring.jpa.hibernate.ddl-auto=update ##控制檯列印sql spring.jpa.show-sql=true
實體類程式碼如下:
package com.dalaoyang.entity; import javax.persistence.*; /** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.entity * @email yangyang@dalaoyang.cn * @date 2018/5/28 */ @Entity public class House { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; @Column(length = 10) private String houseName; private String houseSize; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getHouseName() { return houseName; } public void setHouseName(String houseName) { this.houseName = houseName; } public String getHouseSize() { return houseSize; } public void setHouseSize(String houseSize) { this.houseSize = houseSize; } public House(String houseName, String houseSize) { this.houseName = houseName; this.houseSize = houseSize; } public House(int id,String houseName, String houseSize) { this.id = id; this.houseName = houseName; this.houseSize = houseSize; } public House() { } }
Repository如下:
package com.dalaoyang.repository; import com.dalaoyang.entity.House; import org.springframework.data.jpa.repository.JpaRepository; /** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.repository * @email yangyang@dalaoyang.cn * @date 2018/5/28 */ public interface HouseRepository extends JpaRepository{ }
啟動類上加入@EnableCaching開啟快取,完整程式碼如下:
package com.dalaoyang; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication //開啟快取 @EnableCaching public class SpringbootCacheApplication { public static void main(String[] args) { SpringApplication.run(SpringbootCacheApplication.class, args); } }
還是和以往一樣,使用Controller做測試,先展示一下程式碼:
package com.dalaoyang.controller; import com.dalaoyang.entity.House; import com.dalaoyang.repository.HouseRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.controller * @email yangyang@dalaoyang.cn * @date 2018/5/28 */ @RestController public class HouseController { @Autowired private HouseRepository houseRepository; //別墅&houseSize=1220平方米 @GetMapping("/saveHouse") @CachePut(value = "house", key = "#id") public House saveHouse(Integer id,String houseName,String houseSize){ House house = new House(id,houseName, houseSize); houseRepository.save(house); return house; } // @GetMapping("/queryHouse") @Cacheable(value = "house", key = "#id") public House queryHouse(Integer id){ House house = houseRepository.findOne(id); return house; } // @GetMapping("/deleteHouse") @CacheEvict(value = "house", key = "#id") public String deleteHouse(Integer id){ houseRepository.delete(id); return "success"; } // @GetMapping("/deleteCache") @CacheEvict(value = "house", allEntries = true) public void deleteCache() { } }
解釋測試方法
方法中使用到了@CachePut註解,這個註解直接將返回值放入快取中,通常用於儲存和修改方法中
方法中使用到了@Cacheable註解,這個註解在執行前先檢視快取中是不是已經存在了,如果存在,直接返回。如果不存在,將方法的返回值放入快取。
方法中使用到了@CacheEvict註解,這個註解在執行方法執行成功後會從快取中移除
這個方法的也是使用的@CacheEvict註解,不同的是使用了allEntries熟悉,預設為false,true的時候移除所有快取。
,然後檢視資料庫和控制檯,如下圖:
,檢視頁面資料和控制檯。因為設定了列印執行jpa查詢的話列印sql,看下圖控制檯沒有列印,證明在儲存的時候@CachePut註解已經將其放入了快取中。
然後在次訪問查詢方法,檢視控制檯如下,可以到清空快取後,在訪問就需要查詢資料庫。
,然後在方法查詢方法,檢視控制檯如下,可以到刪除快取後,在訪問也查詢了資料庫。
原始碼下載 :
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3407/viewspace-2804706/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- springboot +lettuce +redis 快取使用Spring BootRedis快取
- springboot註解方式使用redis快取Spring BootRedis快取
- SpringBoot中使用Redis實現快取Spring BootRedis快取
- SpringBoot中Shiro快取使用Redis、EhcacheSpring Boot快取Redis
- SpringBoot快取管理(一) 預設快取管理Spring Boot快取
- SpringBoot快取管理(二) 整合Redis快取實現Spring Boot快取Redis
- SpringBoot系列——cache快取Spring Boot快取
- SpringBoot整合Redis快取Spring BootRedis快取
- SpringBoot註解使用redis做快取總結Spring BootRedis快取
- Springboot 整合 SpringCache 使用 Redis 作為快取Spring BootGCRedis快取
- SpringBoot 下 Mybatis 的快取Spring BootMyBatis快取
- 介紹SpringBoot 整合 Redis 快取Spring BootRedis快取
- SpringBoot 註解呼叫Redis快取Spring BootRedis快取
- SpringBoot 整合快取效能之王 CaffeineSpring Boot快取
- SpringBoot中整合Redis(快取篇)Spring BootRedis快取
- SpringBoot快取管理(三) 自定義Redis快取序列化機制Spring Boot快取Redis
- SpringBoot專案中使用快取Cache的正確姿勢!!!Spring Boot快取
- 如何在SpringBoot中清除所有快取 ?Spring Boot快取
- SpringBoot中實現兩級快取Spring Boot快取
- 【SpringBoot】結合Redis實現快取Spring BootRedis快取
- nginx快取使用詳解,nginx快取使用及配置步驟Nginx快取
- 如何使用 Redis 快取Redis快取
- EhCache快取使用教程快取
- Laravel使用Redis快取LaravelRedis快取
- jetcache快取使用快取
- 15.SpringBoot整合Redis快取實現Spring BootRedis快取
- 高手如何處理快取:SpringBoot整合Redis實現快取處理(AOP技術)!快取Spring BootRedis
- Springboot mini - Solon詳解(八)- Solon的快取框架使用和定製Spring Boot快取框架
- springboot整合redis2.x,使用spring註解進行快取Spring BootRedis快取
- Mybatis的二級快取、使用Redis做二級快取MyBatis快取Redis
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- springboot利用快取儲存物件從新獲取異常Spring Boot快取物件
- 使用RxJava實現快取RxJava快取
- 分散式快取NCache使用分散式快取
- Mybatis二級快取使用MyBatis快取
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- SpringBoot 實戰 (十一) | 整合資料快取 CacheSpring Boot快取