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

對spring的@Cacheable緩存的使用理解

 更新時間:2025年10月23日 09:15:23   作者:吳名氏.  
這篇文章主要介紹了對spring的@Cacheable緩存的使用理解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1 什么是緩存

第一個問題,首先要搞明白什么是緩存,緩存的意義是什么。

對于普通業(yè)務(wù),如果要查詢一個數(shù)據(jù),一般直接select數(shù)據(jù)庫進行查找。但是在高流量的情況下,直接查找數(shù)據(jù)庫就會成為性能的瓶頸。因為數(shù)據(jù)庫查找的流程是先要從磁盤拿到數(shù)據(jù),再刷新到內(nèi)存,再返回數(shù)據(jù)。磁盤相比于內(nèi)存來說,速度是很慢的,為了提升性能,就出現(xiàn)了基于內(nèi)存的緩存。

這種基于內(nèi)存的緩存,由于無法跟磁盤頻繁進行存儲,所以無法保證數(shù)據(jù)的完整性,隨時有可能丟失,所以架構(gòu)一般使用數(shù)據(jù)庫加緩存的方式,數(shù)據(jù)庫用來持久化數(shù)據(jù),緩存用來處理大流量。

2 本地緩存和集中式緩存

緩存按照存儲方式可以分為這本地緩存和集中式緩存。

本地緩存顧名思義就是存儲在本地上,例如靜態(tài)變量就可以說是一種本地緩存,存儲在了JVM中,或者說自己本地搭建的項目用的redis也算是本地緩存,因為緩存和應(yīng)用都在一臺機器上。

本地緩存效率很高,直接讀取內(nèi)存,沒有網(wǎng)絡(luò)延遲,但是可用性很低,因為出現(xiàn)單點故障的話,數(shù)據(jù)庫和系統(tǒng)都會宕機。

對于大型項目來說,都會有集中式緩存,例如redis集群。緩存和應(yīng)用服務(wù)器是分離的,服務(wù)器需要通過網(wǎng)絡(luò)請求從緩存獲取數(shù)據(jù),一般應(yīng)用服務(wù)器也會采取集群的方式,這樣可以保證高可用,數(shù)據(jù)不易丟失,而且也能保證各個服務(wù)器的緩存數(shù)據(jù)一致。

對于分布式應(yīng)用來說,本地緩存還會出現(xiàn)緩存不一致的問題,因為每個服務(wù)器的本地緩存都是獨立的。

3 本地緩存的優(yōu)點

剛才說了這么多本地緩存的缺點,那為什么還要用呢?

因為如果都放在集中式緩存中,網(wǎng)絡(luò)延遲會成為性能的瓶頸。因為不在本地內(nèi)存,讀取的時間需要加上網(wǎng)絡(luò)通信的時間。所以在對性能要求更大或者緩存內(nèi)容不需要持久化、不需要一致性的情況下,本地緩存更適合。

所以一般的大型項目都采用本地緩存和集中式緩存混合使用的方式。

4 Spring對于緩存的支持

終于說到正題,本地緩存可以通過spring更簡單的管理和使用。

springboot和springmvc都支持緩存,其中CacheManager是Spring提供的緩存接口。

4.1 spring支持的CacheManager

CacheManager

描述

SimpleCacheManager

使用簡單的 Collection 來存儲緩存,主要用于測試

ConcurrentMapCacheManager

使用 ConcurrentMap 來存儲緩存

NoOpCacheManager

僅測試用途,不會實際緩存數(shù)據(jù)

EhCacheCacheManager

使用 EhCache 作為緩存技術(shù)

GuavaCacheManager

使用 Google Guava 的 GuavaCache 作為緩存技術(shù)

HazelcastCacheManager

使用 Hazelcast 作為緩存技術(shù)

JCacheCacheManager

支持 JCache(JSR-107) 標準的實現(xiàn)作為緩存技術(shù),如 ApacheCommonsJCS

RedisCacheManager

使用 Redis 作為緩存技術(shù)

看著非常多,實際上正常用的只有ConcurrentMapCacheManager,EhCacheCacheManager,GuavaCacheManager(一般使用redis,我們需要更靈活的對redis鍵值進行操作,所以不用RedisCacheManager),我們重點去講一下這個GuavaCacheManager。

4.2 GuavaCache

Guava是谷歌開源的Java庫,其中的代表就有這個緩存。

GuavaCache的原理大概是LRU+ConcurrentHashMap,加載在JVM的本地緩存

4.3 引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
<dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>18.0</version>
</dependency>
//有可能需要這個
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.2.5.RELEASE</version>
</dependency>

4.4 創(chuàng)建配置類

@EnableCaching
@Configuration
public class GuavaCacheConfig {

    @Bean
    public CacheManager cacheManager() {
        GuavaCacheManager cacheManager = new GuavaCacheManager();
        cacheManager.setCacheBuilder(
                CacheBuilder.newBuilder().
                        expireAfterWrite(3, TimeUnit.MINUTES));
        return cacheManager;
    }
}

@EnableCaching用來開啟注解功能,這里設(shè)置的失效時間是3分鐘。

Guava Cache 除了代碼中提到的設(shè)置緩存過期時間的策略外,還有其他的策略。下面是 Guava Cache 設(shè)置緩存過期時間的策略:

  • expireAfterAccess: 當(dāng)緩存項在指定的時間段內(nèi)沒有被讀或?qū)懢蜁换厥铡?/li>
  • expireAfterWrite:當(dāng)緩存項在指定的時間段內(nèi)沒有更新就會被回收,如果我們認為緩存數(shù)據(jù)在一段時間后數(shù)據(jù)不再可用,那么可以使用該種策略。
  • refreshAfterWrite:當(dāng)緩存項上一次更新操作之后的多久會被刷新。

4.5 緩存注解

標題終于出現(xiàn)了

注解

解釋

@Cacheable

在方法執(zhí)行前 Spring 先查看緩存中是否有數(shù)據(jù),若有,則直接返回緩存數(shù)據(jù);若無數(shù)據(jù),調(diào)用方法將方法返回值放入緩存中

@CachePut

無論怎樣,都會將方法的返回值放到緩存中。

@CacheEvict

將一條或多條數(shù)據(jù)從緩存中刪除

@Caching

可以通過 @Caching 注解組合多個注解策略在一個方法上

我這里就主要解釋下@Cacheable的用法,因為這個比較常見(其他的我也沒用過)

4.6 @Cacheable的用法

常用參數(shù)有

參數(shù)

解釋

value

名字1

key

名字2

condition

條件判斷,condition="#id>1"表示id大于1的才緩存

unless

條件判斷 ,unless="#id==1"表示id等于1的不緩存

#代表的是EL表達式

這里的key和value和我們以為的緩存鍵值對是不一樣的

value+key 只是我們緩存鍵的名字,真正的值是方法的返回值。

舉一個例子

 @Cacheable(value = "olympic_match_new_action",key = "'get_relate_news_'+#rsc")
 public List<MatchNewsVO> getRelateNews(String rsc){
        ....       
 }

一般value取service名,key取方法名,取名按照數(shù)據(jù)庫的下劃線方式。后面那個#rsc指的是傳進來的參數(shù),這些都是鍵。返回的List就是緩存的值。

5 @Cacheable失效的原因

在配置正常的情況下,本人親歷的失效原因就是一個類的方法調(diào)用了帶有緩存的方法,結(jié)果緩存失效。

我使用service的A方法,想調(diào)用這個service的緩存B方法,這樣是不行的。

原因是@Cacheable是由AOP代理實現(xiàn),生成了帶有緩存的代理類。其他類想調(diào)用這個類的緩存方法時,會去調(diào)用這個代理類的方法,實現(xiàn)緩存功能。但是類內(nèi)部調(diào)用這個方法,就不會去調(diào)用代理類的方法,導(dǎo)致緩存失效

6 總結(jié)

網(wǎng)上關(guān)于spring本地緩存的文章很少很雜,我稍微總結(jié)了一下發(fā)了出來,有自己的理解也有網(wǎng)上的摘抄。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 高價值Java多線程面試題分析

    高價值Java多線程面試題分析

    Java?給多線程編程提供了內(nèi)置的支持。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。多線程是多任務(wù)的一種特別的形式,但多線程使用了更小的資源開銷
    2022-03-03
  • Java線程的聯(lián)合用法實例分析

    Java線程的聯(lián)合用法實例分析

    這篇文章主要介紹了Java線程的聯(lián)合用法,結(jié)合實例形式分析了java線程聯(lián)合的原理、實現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • Java實現(xiàn)視頻格式轉(zhuǎn)換的完整指南

    Java實現(xiàn)視頻格式轉(zhuǎn)換的完整指南

    在Java中實現(xiàn)視頻格式的轉(zhuǎn)換,通常需要借助第三方工具或庫,因為視頻的編解碼操作復(fù)雜且性能需求較高,以下是實現(xiàn)視頻格式轉(zhuǎn)換的常用方法和步驟,需要的朋友可以參考下
    2025-05-05
  • java面向?qū)ο笤O(shè)計原則之迪米特法則分析詳解

    java面向?qū)ο笤O(shè)計原則之迪米特法則分析詳解

    這篇文章主要為大家介紹了java面向?qū)ο笤O(shè)計原則之迪米特法則的示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,學(xué)有所得
    2021-10-10
  • java 中enum的使用方法詳解

    java 中enum的使用方法詳解

    這篇文章主要介紹了java 中enum的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,理解掌握java 中enum的使用方法,需要的朋友可以參考下
    2017-09-09
  • Spring Boot中HTTP請求參數(shù)轉(zhuǎn)換和請求體JSON反序列化的區(qū)別解析

    Spring Boot中HTTP請求參數(shù)轉(zhuǎn)換和請求體JSON反序列化的區(qū)別解析

    本文主要介紹了SpringBoot中HTTP請求參數(shù)轉(zhuǎn)換和請求體JSON反序列化的區(qū)別,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Java_Spring之XML?的?AOP?配置

    Java_Spring之XML?的?AOP?配置

    這篇文章主要介紹了Java_Spring中基于XML的AOP配置,上篇講到的是基于注解的AOP配置,對XML感興趣的同學(xué)可以參考閱讀本文
    2023-04-04
  • Java調(diào)用第三方接口封裝實現(xiàn)

    Java調(diào)用第三方接口封裝實現(xiàn)

    本文主要介紹了Java調(diào)用第三方接口封裝實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java驗證時間格式是否正確方法類項目實戰(zhàn)

    Java驗證時間格式是否正確方法類項目實戰(zhàn)

    在很多場景中我們需要驗證時間日期的是否屬于正確的格式,驗證時間是否符合常規(guī)的,本文就來介紹一下幾種方式,感興趣的可以了解一下
    2022-04-04
  • Spring與Mybatis的整合方法有哪些

    Spring與Mybatis的整合方法有哪些

    本文主要給大家介紹Spring與Mybatis的三種常用整合方法,需要用到的整合框架包mybatis-spring.jar,對spring mybatis整合感興趣的朋友可以參考下本文
    2015-10-10

最新評論

洪江市| 通渭县| 海丰县| 南溪县| 定结县| 电白县| 钦州市| 榆社县| 武胜县| 海伦市| 衡山县| 江达县| 鄂托克旗| 阜城县| 微山县| 彝良县| 阿克陶县| 浙江省| 黑河市| 聊城市| 临澧县| 星座| 泰来县| 新沂市| 呼和浩特市| 嫩江县| 徐水县| 阿合奇县| 龙胜| 佛坪县| 扎囊县| 封开县| 新民市| 合江县| 三门峡市| 宁化县| 达日县| 忻城县| 肥西县| 竹北市| 聊城市|