SpringBoot集成Cache緩存(Ehcache緩存框架,注解方式) | 您所在的位置:網(wǎng)站首頁 › 史上最全的Spring Boot Cache使用與整合 › SpringBoot集成Cache緩存(Ehcache緩存框架,注解方式) |
1.說明
Spring定義了CacheManager和Cache接口, 用來統(tǒng)一不同的緩存技術(shù), 例如JCache,EhCache,Hazelcast,Guava,Redis等。 本文通過Spring Boot Cache緩存抽象, 底層集成Ehcache緩存框架, 演示基于注解的緩存使用方法。 下面基于開發(fā)好Restful接口的微服務: SpringBoot開發(fā)Restful接口 為接口添加緩存功能。 2.新增緩存依賴修改pom.xml文件, 增加spring-boot-starter-cache緩存抽象, 以及ehcache緩存框架的依賴: org.springframework.boot spring-boot-starter-cache net.sf.ehcache ehcache 3.新增ehcache配置文件在src/main/resource目錄下, 新增ehcache.xml配置文件: 4.配置緩存框架修改application.yml, 配置Sping Boot Cache緩存實現(xiàn)為ehcache, 同時指定ehcache的配置文件: spring: cache: type: ehcache ehcache: config: classpath:ehcache.xml 5.啟用緩存功能修改微服務啟動類CacheApplication.java, 新增注解@EnableCaching, 開啟緩存功能: package com.yuwen.spring.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; @EnableCaching @SpringBootApplication public class CacheApplication { public static void main(String[] args) { SpringApplication.run(CacheApplication.class, args); } }這樣服務啟動后, 就會自動開啟緩存了, 下面修改業(yè)務代碼, 配置業(yè)務接口的緩存策略, 演示Spring支持的幾個緩存注解的使用。 6.實體類序列化業(yè)務的User對象需要實現(xiàn)序列化接口, 否則緩存無法保存對象, 修改User.java類, 實現(xiàn)Serializable接口: package com.yuwen.spring.demo.entity; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private static final long serialVersionUID = -3301999810945119126L; private Long id; private String name; private Date birthday; private String email; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", birthday=" + birthday + ", email=" + email + "]"; } } 7.修改業(yè)務接口下面就要修改業(yè)務接口, 使用@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig, 分別定義每個接口的緩存策略。 修改UserController.java接口類: package com.yuwen.spring.demo.controller; import java.util.List; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.yuwen.spring.demo.entity.User; /** * 用戶的增刪改查相關接口 */ @CacheConfig(cacheNames = UserController.USER_CACHE_NAME) @RequestMapping("user") public interface UserController { /** * 用戶緩存名稱 */ String USER_CACHE_NAME = "user"; /** * 用戶緩存主鍵 */ String USER_CACHE_KEY = "targetClass.getName() + #id"; /** * 創(chuàng)建用戶 */ @PostMapping void createUser(@RequestBody User user); /** * 更新用戶 */ @CachePut(key = USER_CACHE_KEY) @PutMapping("{id}") User upadteUser(@PathVariable Long id, @RequestBody User user); /** * 刪除用戶 */ @CacheEvict(key = USER_CACHE_KEY) @DeleteMapping("{id}") void deleteUser(@PathVariable("id") Long id); /** * 查詢指定用戶 */ @Cacheable(key = USER_CACHE_KEY) @GetMapping("one/{id}") User getOneUser(@PathVariable Long id); /** * 查詢所有用戶,支持分頁 */ @GetMapping("all") List getAllUser(@RequestParam(required = false) Integer pageNum, @RequestParam(required = false) Integer pageSize); }主要關注查詢指定用戶,刪除用戶,更新用戶三個接口。 8.查詢指定用戶接口說明 @Cacheable(key = USER_CACHE_KEY) @GetMapping("one/{id}") User getOneUser(@PathVariable Long id);查詢指定用戶使用了@Cacheable注解, 同時指定了緩存key的名稱為"targetClass.getName() + #id", 這樣保存在緩存的key就為"當前類名稱+方法入?yún)d", 對應緩存的value就是接口返回的User。 同時在接口UserController.java上的注解 @CacheConfig(cacheNames = UserController.USER_CACHE_NAME), 指定了緩存的名稱為user, 對應ehcache.xml中配置的名稱: 由于在類上面聲明的注解, 所以類的所有帶有@Cacheable、@CachePut、@CacheEvict注解的 接口都使用user這個緩存, 下面的接口不再特別說明這個注解。 @Cacheable表示先從緩存中查詢, 如果查詢到就直接返回對應數(shù)據(jù), 如果查詢不到就進入方法內(nèi)部, 當方法返回數(shù)據(jù)時, 把對應的數(shù)據(jù)放到緩存中, 以備下次查詢使用。 使用效果是第一次查詢時, 會從數(shù)據(jù)庫查詢并且返回, 第二次查詢時, 發(fā)現(xiàn)緩存中有數(shù)據(jù), 就會直接返回緩存的數(shù)據(jù)。 9.刪除用戶接口說明 @CacheEvict(key = USER_CACHE_KEY) @DeleteMapping("{id}") void deleteUser(@PathVariable("id") Long id);@CacheEvict是用來清除緩存的注解, 使用效果是當刪除用戶時, 同時刪除緩存中的數(shù)據(jù), 否則當一個用戶已經(jīng)刪除, 但是調(diào)用查詢指定用戶接口, 還是會返回已經(jīng)緩存的數(shù)據(jù), 那業(yè)務就會發(fā)生錯誤。 另外通過設置@CachEvict的allEntries=true, 調(diào)用這個接口時, 會刪除緩存user中的所有數(shù)據(jù), 而不單單是刪除指定key的緩存。 10.更新用戶接口 @CachePut(key = USER_CACHE_KEY) @PutMapping("{id}") User upadteUser(@PathVariable Long id, @RequestBody User user);@CachePut只是用來緩存結(jié)果的, 并不會從緩存中查詢數(shù)據(jù), 符合更新用戶接口的邏輯, 當用戶更新接口被調(diào)用時, 這個接口一定會被執(zhí)行, 同時把接口返回的結(jié)果緩存, 這樣調(diào)用查詢指定用戶接口, 就能直接從緩存中返回更新過的用戶。 注意@CachePut注解的方法一定要有返回值, 否則框架不知道緩存什么數(shù)據(jù)。 11.參考文章史上最全的Spring Boot Cache使用與整合 SpringBoot學習-(十八)SpringBoot整合EhCache |
今日新聞 |
推薦新聞 |
專題文章 |
CopyRight 2018-2019 實驗室設備網(wǎng) 版權(quán)所有 |