最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring框架中的本地緩存之spring cache基本使用詳解

 更新時間:2025年05月19日 09:25:05   作者:?abc!  
Spring Cache 是 Spring 提供的一整套的緩存解決方案,它提供了一整套的接口和代碼規(guī)范、配置、注解等,這樣它就可以整合各種緩存方案了,本文給大家介紹spring框架中的本地緩存之spring cache基本使用,感興趣的朋友一起看看吧

基本概念及原理

處理邏輯

Spring Cache 是 Spring 提供的一整套的緩存解決方案。

雖然它本身并沒有提供緩存的實現(xiàn),但是它提供了一整套的接口和代碼規(guī)范、配置、注解等,這樣它就可以整合各種緩存方案了

處理邏輯:

每次調(diào)用某方法,而此方法又是帶有緩存功能時,Spring 框架就會檢查指定參數(shù)的那個方法是否已經(jīng)被調(diào)用過,如果之前調(diào)用過,就從緩存中取之前調(diào)用的結(jié)果;如果沒有調(diào)用過,則再調(diào)用一次這個方法,并緩存結(jié)果,然后再返回結(jié)果,那下次調(diào)用這個方法時,就可以直接從緩存中獲取結(jié)果了

實現(xiàn)步驟

SpringCache實現(xiàn)步驟 :

  • 啟用緩存 :通過 @EnableCaching 注解觸發(fā) Spring 的緩存代理配置。
  • AOP 攔截 :Spring 為標記注解的方法生成代理對象,在方法調(diào)用前后插入緩存操作。
  • 緩存處理 :根據(jù)注解配置,調(diào)用 CacheManager 獲取 Cache 實例,執(zhí)行讀寫或刪除操作。

核心原理

Spring Cache 的核心原理基于 AOP(面向切面編程) 和 緩存抽象 ,通過注解簡化緩存邏輯的集成。

核心是 緩存抽象層 和 動態(tài)代理機制 ,結(jié)合 Spring Boot 的自動配置,可快速集成多種緩存方案,顯著提升系統(tǒng)性能

Spring Cache 通過 抽象層 解耦具體緩存技術(shù)

  • 適配器模式 :通過 CacheManager 和 Cache 接口適配不同緩存實現(xiàn)(如 Redis、Ehcache)。
  • 自動配置 :Spring Boot 的 spring-boot-autoconfigure 模塊自動檢測并配置緩存實現(xiàn)(如引入 spring-boot-starter-data-redis 后自動啟用 Redis 緩存)。

核心組件與抽象

Cache 接口 :定義緩存操作(如 get、put、evict),具體實現(xiàn)由第三方緩存技術(shù)(如 Redis、Caffeine)提供。

CacheManager 接口 :管理多個 Cache 實例,負責創(chuàng)建、配置和獲取緩存對象

例如:

ConcurrentMapCacheManager(默認內(nèi)存緩存)RedisCacheManager(Redis 實現(xiàn))EhCacheCacheManager(Ehcache 實現(xiàn))

核心注解

Spring 提供了五個注解來聲明緩存規(guī)則。

@Cacheable:方法執(zhí)行前檢查緩存,命中則直接返回,否則執(zhí)行方法并緩存結(jié)果。
@CachePut:方法調(diào)用前不會去緩存中查找,無論緩存是否存在,都執(zhí)行方法并更新緩存。
@CacheEvict:刪除指定緩存,清除緩存中的一條或多條記錄
@Caching:組合多個緩存操作。
@CacheConfig:在類級別共享相同的緩存的配置

注解作用常用參數(shù)
@Cacheable方法結(jié)果緩存(先查緩存,未命中執(zhí)行方法),一般用在查詢方法上value, key, condition
@CachePut強制更新緩存(始終執(zhí)行方法),一般用在新增方法上value, key, unless
@CacheEvict清除緩存,一般用在更新或者刪除方法上value, key, allEntries
@Caching組合多個緩存操作,實現(xiàn)同一個方法上同時使用多種注解cacheable, put, evict
@CacheConfig類級別共享緩存配置cacheNames, keyGenerator

SpEL 表達式

場景表達式示例
防緩存穿透unless = “#result == null”
多字段復合鍵key = “#user.id + ‘:’ + #user.deviceId”
時間戳動態(tài)鍵key = “T(System).currentTimeMillis()”
權(quán)限過濾condition = “#authLevel > 3”
集合非空判斷condition = “!#list.isEmpty()”

實現(xiàn)

pom依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

選擇使用的緩存

# 使用redis進行緩存
spring.cache.type=redis

Spring Cache 支持很多緩存中間件作為框架中的緩存,總共有 9 種選擇:

  • caffeine:Caffeine 是一種高性能的緩存庫,基于 Google Guava。
  • couchbase:CouchBase是一款非關(guān)系型JSON文檔數(shù)據(jù)庫。
  • generic:由泛型機制和 static 組合實現(xiàn)的泛型緩存機制。
  • hazelcast:一個高度可擴展的數(shù)據(jù)分發(fā)和集群平臺,可用于實現(xiàn)分布式數(shù)據(jù)存儲、數(shù)據(jù)緩存。
  • infinispan:分布式的集群緩存系統(tǒng)。
  • jcache:JCache 作為緩存。它是 JSR107 規(guī)范中提到的緩存規(guī)范。
  • none:沒有緩存。
  • redis:用 Redis 作為緩存
  • simple:用內(nèi)存作為緩存

基本概念

啟動類上面添加@EnableCaching注解

指定某方法開啟緩存功能。在方法上添加 @Cacheable 緩存注解就可以了。

@Cacheable 注解中,可以添加四種參數(shù):value,key,condition,unless

  • value:指定緩存名稱(必填)
  • key:自定義緩存鍵(SpEL表達式)
  • condition:執(zhí)行前條件判斷(SpEL)
  • unless:執(zhí)行后結(jié)果過濾(SpEL)
參數(shù)類型作用示例
valueString[]指定緩存名稱(必填)value = “users” 或 value = {“cache1”, “cache2”}
keyString自定義緩存鍵(SpEL表達式)key = "#userId"或key = “T(java.util.UUID).randomUUID().toString()”
conditionString執(zhí)行前條件判斷(SpEL)condition = "#userId > 1000"或condition = “#name.startsWith(‘admin’)”
unlessString執(zhí)行后結(jié)果過濾(SpEL)unless = "#result == null"或unless = “#result.age < 18”

使用示例1

第一次調(diào)用下面這個接口前,緩存里面是沒有hot緩存,也沒有這個test方法的結(jié)果緩存

調(diào)用test方法后,緩存中便會創(chuàng)建出hot這個緩存,其中緩存了一個key(默認值SimpleKey[]),其中有一個值

  • 緩存中 key 對應(yīng)的 value 默認使用 JDK 序列化后的數(shù)據(jù)。
  • value 的過期時間為 -1,表示永不過期。

key:hot:SimpleKey[]
value:222

@RequestMapping("/test2")
@Cacheable({"hot"})
public int test() {
    return 222;
}

第二次調(diào)用test()方法時,便會直接讀緩存,而不去執(zhí)行test里面的方法

@RequestMapping("/test2")
@Cacheable({"hot"})
public int test2() {
    return 456;
}

如果再將類名改為test2后,緩存獲取到的值還是test方法時緩存的值222,因為兩個方法的key值都是SimpleKey[]

使用示例2

// 啟用緩存(配置類)
@EnableCaching
@Configuration
public class CacheConfig {
    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("users"); // 內(nèi)存緩存
    }
}
// 業(yè)務(wù)層使用
@Service
public class UserService {
    // 緩存讀取(value=緩存名稱,key=緩存鍵)
    @Cacheable(value = "users", key = "#userId")
    public User getUserById(Long userId) {
        // 實際數(shù)據(jù)庫查詢
        return userRepository.findById(userId);
    }
    // 緩存更新
    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        return userRepository.save(user);
    }
    // 緩存清除
    @CacheEvict(value = "users", key = "#userId")
    public void deleteUser(Long userId) {
        userRepository.deleteById(userId);
    }
}

自定義配置類

自定義緩存過去時間等

# 使用 Redis 作為緩存組件
spring.cache.type=redis
# 緩存過期時間為 3600s
spring.cache.redis.time-to-live=3600000
# 緩存的鍵的名字前綴
spring.cache.redis.key-prefix=passjava_
# 是否使用緩存前綴
spring.cache.redis.use-key-prefix=true
# 是否緩存控制,防止緩存穿透
spring.cache.redis.cache-null-values=true

自定義 key

在 @Cacheable 注解里面加上 key 的值 #root.method.name。這是一種特有的表達式,稱作 SpEL 表達式,這里代表用方法名作為緩存 key 的名字

@Cacheable(value = {"hot"}, key = "#root.method.name")

如果按上述去配置的話,緩存的key的名稱便是這個方法名

自定義條件

可以自定義條件來決定是否將緩存功能關(guān)閉。這里就要用到@Cacheable 另外兩個屬性:condition 和 unless,它倆的格式還是用 SpEL 表達式

到此這篇關(guān)于spring框架中的本地緩存:spring cache基本使用的文章就介紹到這了,更多相關(guān)spring cache使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)組常用排序算法實例小結(jié)

    Java數(shù)組常用排序算法實例小結(jié)

    這篇文章主要介紹了Java數(shù)組常用排序算法,結(jié)合實例形式總結(jié)分析了java數(shù)組常用的4種排序算法,包括冒泡排序、數(shù)組遞增排序、快速排序及選擇排序,需要的朋友可以參考下
    2017-12-12
  • SpringMVC通過注解實現(xiàn)全局異常處理問題小結(jié)

    SpringMVC通過注解實現(xiàn)全局異常處理問題小結(jié)

    文章介紹SpringMVC全局異常處理機制,通過@ControllerAdvice和@ExceptionHandler注解實現(xiàn)統(tǒng)一異常處理,提升代碼可維護性與響應(yīng)一致性,減少重復try-catch代碼,增強系統(tǒng)健壯性,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • PowerJob Alarmable工作流程源碼剖析

    PowerJob Alarmable工作流程源碼剖析

    這篇文章主要為大家介紹了PowerJob Alarmable工作流程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Mybatis-plus對單表操作的封裝實現(xiàn)

    Mybatis-plus對單表操作的封裝實現(xiàn)

    本文詳細介紹了MyBatis-Plus單表操作,包括自定義SQL、邏輯刪除、樂觀鎖、全局攔截器和代碼生成器等,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • springboot項目事務(wù)標簽驗證

    springboot項目事務(wù)標簽驗證

    本文主要介紹了springboot項目事務(wù)標簽驗證,文中通過示例代碼介紹的非常詳細,詳細的介紹了不加事務(wù)標簽和加事物標簽的使用,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • Java中替代equals,compareTo和toString的方法

    Java中替代equals,compareTo和toString的方法

    這篇文章主要介紹了Java中替代equals,compareTo和toString的方法,文中代碼十分詳細,幫助大家更好的理解的學習,感興趣的朋友可以了解下
    2020-06-06
  • 詳細聊一聊java中封裝的那點事

    詳細聊一聊java中封裝的那點事

    封裝是一個非常廣泛的概念,小到一個屬性的封裝,大到一個框架或者一個項目的封裝,下面這篇文章主要給大家介紹了關(guān)于java中封裝的那點事,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • Maven清理java項目中未使用到 jar 依賴包的方法

    Maven清理java項目中未使用到 jar 依賴包的方法

    本文主要介紹了Maven清理java項目中未使用到 jar 依賴包的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Java騷操作之CountDownLatch代碼詳解

    Java騷操作之CountDownLatch代碼詳解

    這篇文章主要介紹了Java騷操作之CountDownLatch代碼詳解,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 詳解JavaWeb中的過濾器Filter

    詳解JavaWeb中的過濾器Filter

    今天給大家講一下JavaWeb中的過濾器Filter,文中有非常詳細的代碼示例,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05

最新評論

巴里| 永修县| 尤溪县| 永州市| 凤庆县| 昌宁县| 都昌县| 库车县| 五峰| 郴州市| 浙江省| 哈尔滨市| 鄱阳县| 普洱| 威宁| 乌鲁木齐县| 石门县| 清河县| 攀枝花市| 商河县| 科技| 达日县| 慈溪市| 鹿邑县| 台东县| 泗阳县| 通山县| 襄樊市| 文化| 珲春市| 蒙阴县| 虹口区| 莆田市| 道孚县| 湖南省| 从江县| 芒康县| 京山县| 古田县| 吴旗县| 隆子县|