欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中的@Cacheable緩存注解詳解

 更新時間:2023年05月12日 11:30:28   作者:Java筆記蝦  
這篇文章主要介紹了Spring中的@Cacheable緩存注解詳解,數(shù)據(jù)庫查找的流程是先要從磁盤拿到數(shù)據(jù),再刷新到內存,再返回數(shù)據(jù)。磁盤相比于內存來說,速度是很慢的,為了提升性能,就出現(xiàn)了基于內存的緩存,需要的朋友可以參考下

1 什么是緩存

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

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

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

2 本地緩存和集中式緩存

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

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

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

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

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

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

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

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

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

4 Spring對于緩存的支持

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

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

4.1 spring支持的CacheManager

60d4849a0ea96abea563dcb8af30ff6d.png

看著非常多,實際上正常用的只有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用來開啟注解功能,這里設置的失效時間是3分鐘。

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

  • expireAfterAccess: 當緩存項在指定的時間段內沒有被讀或寫就會被回收。
  • expireAfterWrite:當緩存項在指定的時間段內沒有更新就會被回收,如果我們認為緩存數(shù)據(jù)在一段時間后數(shù)據(jù)不再可用,那么可以使用該種策略。
  • refreshAfterWrite:當緩存項上一次更新操作之后的多久會被刷新。

4.5 緩存注解

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

991c3395fd30d45f43b2310f82215227.png

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

4.6 @Cacheable的用法

常用參數(shù)有

d66e8edcf27e46adff27469f2bc76392.png

#代表的是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失效的原因

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

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

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

到此這篇關于Spring中的@Cacheable緩存注解詳解的文章就介紹到這了,更多相關Spring @Cacheable緩存注解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringMVC中的http Caching的具體使用

    SpringMVC中的http Caching的具體使用

    本文主要介紹了SpringMVC中的http Caching的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • ElasticSearch的完整安裝教程

    ElasticSearch的完整安裝教程

    這篇文章主要給大家分享介紹了ElasticSearch的完整安裝教程,文中通過示例代碼介紹的非常詳細,對大家學習或者使用ElasticSearch具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • Spring Boot配置線程池拒絕策略的場景分析(妥善處理好溢出的任務)

    Spring Boot配置線程池拒絕策略的場景分析(妥善處理好溢出的任務)

    本文通過實例代碼給大家介紹下如何為線程池配置拒絕策略、如何自定義拒絕策略。對Spring Boot配置線程池拒絕策略的相關知識感興趣的朋友一起看看吧
    2021-09-09
  • SpringBoot集成Mybatis-Plus多租戶架構實現(xiàn)

    SpringBoot集成Mybatis-Plus多租戶架構實現(xiàn)

    本文主要介紹了SpringBoot集成Mybatis-Plus多租戶架構實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java中的分割字符串?split(“.”)無效問題

    Java中的分割字符串?split(“.”)無效問題

    這篇文章主要介紹了Java中的分割字符串?split(“.”)無效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • springboot如何添加全局異常捕獲類

    springboot如何添加全局異常捕獲類

    這篇文章主要介紹了springboot如何添加全局異常捕獲類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot中自定義注解實現(xiàn)控制器訪問次數(shù)限制實例

    SpringBoot中自定義注解實現(xiàn)控制器訪問次數(shù)限制實例

    本篇文章主要介紹了SpringBoot中自定義注解實現(xiàn)控制器訪問次數(shù)限制實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • ReentrantLock條件變量使多個線程順序執(zhí)行

    ReentrantLock條件變量使多個線程順序執(zhí)行

    這篇文章主要為大家介紹了ReentrantLock條件變量使多個線程順序執(zhí)行,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 在Spring中自動裝配Bean的屬性

    在Spring中自動裝配Bean的屬性

    今天小編就為大家分享一篇關于在Spring中自動裝配Bean的屬性,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java中的HashSet集合存儲數(shù)據(jù)的結構詳解

    Java中的HashSet集合存儲數(shù)據(jù)的結構詳解

    這篇文章主要介紹了Java中的HashSet集合存儲數(shù)據(jù)的結構詳解,數(shù)組結構他把元素進行分組,相同哈希值的元素是一組,鏈表/紅黑樹結構把相同哈希值的元素鏈接到一起,存儲數(shù)據(jù)到集合中,先計算元素的哈希值,需要的朋友可以參考下
    2023-09-09

最新評論