Spring Boot集成Spring Cache過(guò)程詳解
一、關(guān)于Spring Cache
緩存在現(xiàn)在的應(yīng)用中越來(lái)越重要,
Spring從3.1開(kāi)始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口來(lái)統(tǒng)一不同的緩存技術(shù),并支持使用JCache(JSR-107)注解簡(jiǎn)化我們開(kāi)發(fā)。
通過(guò)SpringCache,可以快速嵌入自己的Cache實(shí)現(xiàn),主要是@Cacheable、@CachePut、@CacheEvict、@CacheConfig、@Caching等注解來(lái)實(shí)現(xiàn)。
- @Cacheable:作用于方法上,用于對(duì)于方法返回結(jié)果進(jìn)行緩存,如果已經(jīng)存在該緩存,則直接從緩存中獲取,緩存的key可以從入?yún)⒅兄付?,緩存的value為方法返回值。
- @CachePut:作用于方法上,無(wú)論是否存在該緩存,每次都會(huì)重新添加緩存,緩存的key可以從入?yún)⒅兄付?,緩存的value為方法返回值,常用作于更新。
- @CacheEvict:作用于方法上,用于清除緩存。
- @CacheConfig:作用在類(lèi)上,統(tǒng)一配置本類(lèi)的緩存注解的屬性。
- @Caching:作用于方法上,用于一次性設(shè)置多個(gè)緩存。
- @EnableCaching:作用于類(lèi)上,用于開(kāi)啟注解功能。
二、演示示例
欲使用Spring Cache,需要先引入Spring Cache的依賴(lài)。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Spring Cache依賴(lài)--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
然后在啟動(dòng)類(lèi)上,我們需要使用@EnableCaching來(lái)聲明開(kāi)啟緩存。
@EnableCaching //開(kāi)啟緩存
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
這樣就可以使用注解來(lái)操作緩存了,創(chuàng)建CacheService類(lèi),其中dataMap的Map存儲(chǔ)數(shù)據(jù),省去了數(shù)據(jù)庫(kù)的操作。
@Slf4j
@Service
public class CacheService {
private Map<Integer, User> dataMap = new HashMap <Integer, User>(){
{
for (int i = 1; i < 100 ; i++) {
User u = new User("code" + i, "name" + i);
put(i, u);
}
}
};
// 獲取數(shù)據(jù)
@Cacheable(value = "cache", key = "'user:' + #id")
public User get(int id){
log.info("通過(guò)id{}查詢獲取", id);
return dataMap.get(id);
}
// 更新數(shù)據(jù)
@CachePut(value = "cache", key = "'user:' + #id")
public User set(int id, User u){
log.info("更新id{}數(shù)據(jù)", id);
dataMap.put(id, u);
return u;
}
//刪除數(shù)據(jù)
@CacheEvict(value = "cache", key = "'user:' + #id")
public User del(int id){
log.info("刪除id{}數(shù)據(jù)", id);
dataMap.remove(id);
return u;
}
}
get方法模擬查詢,@Cacheable用于添加緩存,set方法用于修改,@CachePut更新緩存,del方法用于刪除數(shù)據(jù), @CacheEvict刪除緩存。需要注意的是,注解的value表示緩存分類(lèi),并不是指緩存的對(duì)象值。
然后在創(chuàng)建CacheApi,用于調(diào)用CacheService進(jìn)行測(cè)試。
@RestController
@RequestMapping("cache")
public class CacheApi {
@Autowired
private CacheService cacheService;
@GetMapping("get")
public User get(@RequestParam int id){
return cacheService.get(id);
}
@PostMapping("set")
public User set(@RequestParam int id, @RequestParam String code, @RequestParam String name){
User u = new User(code, name);
return cacheService.set(id, u);
}
@DeleteMapping("del")
public void del(@RequestParam int id){
cacheService.del(id);
}
}
然后我們打開(kāi)swagger-ui界面(http://localhost:10900/swagger-ui.html)進(jìn)行測(cè)試,多次調(diào)用查詢,可以看到, CacheService的get方法,對(duì)于同一id僅僅執(zhí)行一遍。然后再調(diào)用更新,再次get時(shí),即可發(fā)現(xiàn)數(shù)據(jù)已經(jīng)更新,而調(diào)用del,則可以清除緩存,再次查詢又會(huì)調(diào)用方法。

源碼地址:https://github.com/imyanger/springboot-project/tree/master/p20-springboot-cache
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)對(duì)字符串中的數(shù)值進(jìn)行排序操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)對(duì)字符串中的數(shù)值進(jìn)行排序操作,涉及java字符串與數(shù)組的相互轉(zhuǎn)換以及數(shù)組排序相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
spring boot 使用Aop通知打印控制器請(qǐng)求報(bào)文和返回報(bào)文問(wèn)題
這篇文章主要介紹了spring-boot 使用Aop通知打印控制器請(qǐng)求報(bào)文和返回報(bào)文,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04
JAVA實(shí)戰(zhàn)項(xiàng)目實(shí)現(xiàn)客戶選購(gòu)系統(tǒng)詳細(xì)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的客戶選購(gòu)系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-10-10
String StringBuilder StringBuffer區(qū)別以及源碼分析
string是C++標(biāo)準(zhǔn)庫(kù)的一個(gè)重要的部分,主要用于字符串處理??梢允褂幂斎胼敵隽鞣绞街苯舆M(jìn)行string操作,同時(shí),C++的算法庫(kù)對(duì)string類(lèi)也有著很好的支持,并且string類(lèi)還和c語(yǔ)言的字符串之間有著良好的接口2021-06-06
踩坑批量更新sql報(bào)錯(cuò),實(shí)際sql能夠正常執(zhí)行的問(wèn)題
在項(xiàng)目工程遷移過(guò)程中,遇到了一個(gè)批量更新接口在新工程中報(bào)錯(cuò)的問(wèn)題,通過(guò)分析,排除了代碼錯(cuò)誤的可能,最終發(fā)現(xiàn)是由于數(shù)據(jù)庫(kù)連接配置不當(dāng)導(dǎo)致的,在jdbc連接字符串中加入allowMultiQueries=true參數(shù)后,問(wèn)題得以解決,這個(gè)參數(shù)的作用是允許SQL批量執(zhí)行2022-12-12
詳解Java如何實(shí)現(xiàn)企業(yè)微信審批流程
這篇文章主要使用了一個(gè)Java示例代碼,來(lái)向大家展示如何在企業(yè)微信中實(shí)現(xiàn)審批流程,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考下2024-11-11

