SpringBoot使用@Cacheable注解實(shí)現(xiàn)緩存功能流程詳解
一、Spring從3.1開始支持Cache
Spring 從 3.1 開始就引入了對(duì) Cache 的支持。定義了 org.springframework.cache.Cache和 org.springframework.cache.CacheManager接口來統(tǒng)一不同的緩存技術(shù)。并支持使用 JCache(JSR-107)注解簡(jiǎn)化我們的開發(fā)。
其使用方法和原理都類似于 Spring 對(duì)事務(wù)管理的支持,Spring Cache 是作用在方法上的,其核心思想是,當(dāng)我們?cè)谡{(diào)用一個(gè)緩存方法時(shí)會(huì)把該方法參數(shù)和返回結(jié)果作為一個(gè)鍵值對(duì)存在緩存中。
SpringBoot中提供的緩存注解@Cacheable,@Cacheable會(huì)將方法的返回值作為緩存的value,默認(rèn)將方法的參數(shù)值作為緩存的key。@Cacheable可以標(biāo)記在某個(gè)具體的方法上,也可以標(biāo)記帶一個(gè)類上,表示該類的所有方法都支持緩存。
每次調(diào)用需要緩存功能的方法時(shí),Spring 會(huì)檢查指定參數(shù)的指定目標(biāo)方法是否已經(jīng)被調(diào)用過,如果有就直接從緩存中獲取方法調(diào)用后的結(jié)果,如果沒有就調(diào)用方法并緩存結(jié)果后返回給用戶,下次調(diào)用直接從緩存中獲取。
二、@Cacheable常用屬性
- @Cacheable添加緩存,相同條件的查詢不再查詢數(shù)據(jù)庫(kù),而是從緩存中查詢;
- @CachePut每次都會(huì)訪問數(shù)據(jù)庫(kù),并更新緩存;
- @CacheEvict清除緩存;

1、value/cacheNames
如上圖所示,這兩個(gè)屬性代表的意義相同,這兩個(gè)屬性都是用來指定緩存組件的名稱,即將方法的返回結(jié)果放在哪個(gè)緩存中,屬性定義為數(shù)組,可以指定多個(gè)緩存;
2、key
可以通過 key 屬性來指定緩存數(shù)據(jù)所使用的的 key,默認(rèn)使用的是方法調(diào)用傳過來的參數(shù)作為 key。最終緩存中存儲(chǔ)的內(nèi)容格式為:Entry<key,value> 形式。
3、condition
觸發(fā)條件。這個(gè)參數(shù)是規(guī)定這個(gè)緩存觸發(fā)的條件拼接,例如 condition="#area.id != 1",就是在id不為1的時(shí)候觸發(fā)緩存。
4、unless
排除條件。這個(gè)參數(shù)是規(guī)定這個(gè)緩存在何時(shí)不觸發(fā),例如 unless="#result == null",不對(duì)查詢結(jié)果為NULL的結(jié)果進(jìn)行緩存。
5、keyGenerator
自定義的Key策略,比如緩存的Key值就是方法名。
@Configuration
public class CacheConfig{
@Bean
public KeyGenerator myKeyGenerator(){
return (target,method,params)->method.getName();
}
}
KeyGenerator 是Spring提供的一個(gè)函數(shù)式接口。
package org.springframework.cache.interceptor;
import java.lang.reflect.Method;
/**
* Cache key generator. Used for creating a key based on the given method
* (used as context) and its parameters.
*
* @author Costin Leau
* @author Chris Beams
* @author Phillip Webb
* @since 3.1
*/
@FunctionalInterface
public interface KeyGenerator {
/**
* Generate a key for the given method and its parameters.
* @param target the target instance
* @param method the method being called
* @param params the method parameters (with any var-args expanded)
* @return a generated key
*/
Object generate(Object target, Method method, Object... params);
}
通過@Cacheable(keyGenerator=“myKeyGenerator”)指定Key自定義的生成策略。
6、sync
是否使用異步模式,默認(rèn)是方法執(zhí)行完,以同步的方式將方法返回的結(jié)果存在緩存中。
7、cacheManager
可以用來指定緩存管理器,從哪個(gè)緩存管理器里面獲取緩存。
三、整合步驟
1、加入pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2、啟動(dòng)類加@EnableCaching注解
3、controller或service加@Cacheable注解即可 四、代碼實(shí)例
package com.nezha.controller;
import com.nezha.entity.Area;
import com.nezha.service.area.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/area")
public class AreaController {
@Autowired
private AreaService areaService;
// @Cacheable添加緩存,相同條件的查詢不再查詢數(shù)據(jù)庫(kù),而是從緩存中查詢
@Cacheable(cacheNames="area",key = "#id")
@GetMapping("getAreaById")
public Area getAreaById(Integer id) {
return areaService.getAreaById(id);
}
// @CachePut每次都會(huì)訪問數(shù)據(jù)庫(kù),并更新緩存
@CachePut(cacheNames="area",key = "#id")
@PostMapping("updateAreaById")
public void updateAreaById(Integer id) {
areaService.updateAreaById(id);
}
// @CacheEvict清除緩存
@CacheEvict(cacheNames="area",key = "#id")
@PostMapping("deleteAreaById")
public void deleteAreaById(Integer id) {
areaService.deleteAreaById(id);
}
}
通過postman訪問127.0.0.1:8080/NettyProject/area/getAreaById?id=1,第一次時(shí)控制臺(tái)輸出sql日志,第二次請(qǐng)求時(shí),控制臺(tái)無(wú)日志輸出,證明未進(jìn)行sql查詢,查詢的是@Cacheable(cacheNames="area",key = "#id")緩存的數(shù)據(jù)。
到此這篇關(guān)于SpringBoot使用@Cacheable注解實(shí)現(xiàn)緩存功能流程詳解的文章就介紹到這了,更多相關(guān)SpringBoot @Cacheable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea項(xiàng)目debug模式啟動(dòng),斷點(diǎn)失效,斷點(diǎn)紅點(diǎn)內(nèi)無(wú)對(duì)勾問題及解決
這篇文章主要介紹了idea項(xiàng)目debug模式啟動(dòng),斷點(diǎn)失效,斷點(diǎn)紅點(diǎn)內(nèi)無(wú)對(duì)勾問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
Java 圖解Spring啟動(dòng)時(shí)的后置處理器工作流程是怎樣的
spring的后置處理器有兩類,bean后置處理器,bf(BeanFactory)后置處理器。bean后置處理器作用于bean的生命周期,bf的后置處理器作用于bean工廠的生命周期2021-10-10
MyBatis Plus中InnerInterceptor的實(shí)現(xiàn)
本文主要介紹了MyBatis Plus中InnerInterceptor的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
spring mvc利用ajax向controller傳遞對(duì)象的方法示例
這篇文章主要給大家介紹了關(guān)于spring mvc利用ajax向controller傳遞對(duì)象的相關(guān)資料,文中通過示例代碼將步驟介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
SpringSecurity自定義AuthenticationProvider無(wú)法@Autowire的解決
這篇文章主要介紹了SpringSecurity自定義AuthenticationProvider無(wú)法@Autowire的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java工作流實(shí)現(xiàn)與實(shí)踐步驟(最新)
本文詳細(xì)探討了如何使用Java實(shí)現(xiàn)工作流,包括基本要素、流行框架(如jbpm、Activiti、jWorkFlow)和實(shí)現(xiàn)步驟,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-09-09
SpringBoot使用Druid數(shù)據(jù)源的配置方法
這篇文章主要介紹了SpringBoot使用Druid數(shù)據(jù)源的配置方法,文中代碼實(shí)例相結(jié)合的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧2018-04-04
Spring?Boot?3中一套可以直接用于生產(chǎn)環(huán)境的Log4J2日志配置詳解
Log4J2是Apache Log4j的升級(jí)版,參考了logback的一些優(yōu)秀的設(shè)計(jì),并且修復(fù)了一些問題,因此帶來了一些重大的提升,這篇文章主要介紹了Spring?Boot?3中一套可以直接用于生產(chǎn)環(huán)境的Log4J2日志配置,需要的朋友可以參考下2023-12-12
java實(shí)現(xiàn)圖的鄰接表存儲(chǔ)結(jié)構(gòu)的兩種方式及實(shí)例應(yīng)用詳解
這篇文章主要介紹了java實(shí)現(xiàn)圖的鄰接表存儲(chǔ)結(jié)構(gòu)的兩種方式及實(shí)例應(yīng)用詳解,鄰接表構(gòu)建圖是必須需要一個(gè)Graph對(duì)象,也就是圖對(duì)象!該對(duì)象包含屬性有:頂點(diǎn)數(shù)、邊數(shù)以及圖的頂點(diǎn)集合,需要的朋友可以參考下2019-06-06

