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

Spring Cache的基本使用與實(shí)現(xiàn)原理詳解

 更新時(shí)間:2018年05月06日 10:12:58   作者:張濤  
緩存是實(shí)際工作中非經(jīng)常常使用的一種提高性能的方法, 我們會(huì)在很多場(chǎng)景下來(lái)使用緩存。下面這篇文章主要給大家介紹了關(guān)于Spring Cache的基本使用與實(shí)現(xiàn)原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

Spring Cache 概念

從Spring 3.1版本開(kāi)始,提供了一種透明的方式來(lái)為現(xiàn)有的Spring 應(yīng)用添加cache,使用起來(lái)就像@Transaction一樣。在應(yīng)用層面與后端存儲(chǔ)之間,提供了一層抽象,這層抽象目的在于封裝各種可插拔的后端存儲(chǔ)( Ehcache Guava Redis),最小化因?yàn)榫彺娼o現(xiàn)有業(yè)務(wù)代碼帶來(lái)的侵入。

Spring 的緩存技術(shù)還具備相當(dāng)?shù)撵`活性。不僅能夠使用 SpEL(Spring Expression Language)來(lái)定義緩存的 key 和各種 condition,還提供開(kāi)箱即用的緩存暫時(shí)存儲(chǔ)方案,也支持和主流的專(zhuān)業(yè)緩存比如 EHCache 集成。

其特點(diǎn)總結(jié)例如以下:

  • 通過(guò)少量的配置 annotation 凝視就可以使得既有代碼支持緩存
  • 支持開(kāi)箱即用 Out-Of-The-Box,即不用安裝和部署額外第三方組件就可以使用緩存
  • 支持 Spring Express Language,能使用對(duì)象的不論什么屬性或者方法來(lái)定義緩存的 key 和 condition
  • 支持 AspectJ,并通過(guò)事實(shí)上現(xiàn)不論什么方法的緩存支持
  • 支持自己定義 key 和自己定義緩存管理者,具有相當(dāng)?shù)撵`活性和擴(kuò)展性

設(shè)計(jì)理念

正如Spring框架的其它服務(wù)一樣,Spring cache 首先是提供了一層抽象,核心抽象主要體現(xiàn)在兩個(gè)接口上
org.springframework.cache.Cache

org.springframework.cache.CacheManager

Cache代表緩存本身

CacheManager代表對(duì)緩存的處理和管理等。抽象的意義在于屏蔽實(shí)現(xiàn)細(xì)節(jié)的差異和提供擴(kuò)展性,這一層Cache的抽象解耦了緩存的使用和緩存的后端存儲(chǔ),這樣后續(xù)可以方便的更換后端存儲(chǔ)。

使用Spring Cache分三步:

  • 聲明緩存
  • 開(kāi)啟Spring的cache功能
  • 配置后端的存儲(chǔ)

聲明緩存

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

用法很簡(jiǎn)單,在方法上添加@cacheable等注解,表示緩存該方法的結(jié)果。

當(dāng)方法有被調(diào)用時(shí),先檢查cache中有沒(méi)有針對(duì)該方法相同參數(shù)的調(diào)用發(fā)生過(guò),如果有,從cache中查詢(xún)并返回結(jié)果。如果沒(méi)有,則執(zhí)行具體的方法邏輯,并把結(jié)果緩存到cache中。當(dāng)然這一系列邏輯對(duì)于調(diào)用者來(lái)說(shuō)都是透明的。其它的緩存操作的注解包含如下(詳細(xì)說(shuō)明可參見(jiàn)官方文檔):

  • @Cacheable triggers cache population
  • @CacheEvict triggers cache eviction
  • @CachePut updates the cache without interfering with the method execution
  • @Caching regroups multiple cache operations to be applied on a method
  • @CacheConfig shares some common cache-related settings at class-level

開(kāi)啟Spring Cache的支持

<cache:annotation-driven />

或者使用注解@EnableCaching的方式

配置緩存后端存儲(chǔ)

Spring Cache提供了幾種內(nèi)置的后端存儲(chǔ)的實(shí)現(xiàn):下面都是CacheManager的具體實(shí)現(xiàn)。

此外,Spring Data提供了兩個(gè)緩存管理器:

  • RedisCacheManager(來(lái)自于Spring Data Redis項(xiàng)目)
  • GmfireCacheManager(來(lái)自于Spring Data GemFire項(xiàng)目

假如使用memcached或者redis等分布式緩存的話(huà),可以自己實(shí)現(xiàn)Cache和CacheManager,然后在Context里聲明即可。如果需要使用到多種不同的緩存實(shí)現(xiàn),可以用組合模式把各種不同的CacheManager封裝在一起。

緩存的key是如何生成

我們都知道緩存的存儲(chǔ)方式一般是key value的方式,那么在Spring cache里,key是如何被設(shè)置的呢,在這里要引入KeyGenerator,它負(fù)責(zé)key的生成策略,默認(rèn)的使用SimpleKeyGenerator


能看出來(lái),其中就是有序參數(shù)數(shù)組的hash值。當(dāng)然用戶(hù)可以自定義key生成策略。

Spring Cache的實(shí)現(xiàn)

上面是Spring cache的大致使用方式,來(lái)看是Spring是如何實(shí)現(xiàn)的。

在學(xué)習(xí)Spring源碼的時(shí)候,有兩點(diǎn)可以記?。?br />

  • 大多數(shù)高級(jí)功能的實(shí)現(xiàn)都依賴(lài)Spring AOP
  • 大多數(shù)功能的組裝時(shí)機(jī)都依賴(lài)Sprin bean生命周期中的幾個(gè)回調(diào)接口

記住了這些就比較容易理解Spring中的一些組件的實(shí)現(xiàn)及運(yùn)行時(shí)機(jī)制

Spring cache也不例外,它是典型的Spring AOP實(shí)現(xiàn),在Spring里,aop可以簡(jiǎn)單的理解為代理(AspectJ除外),我們聲明了@Cacheable的方法的類(lèi),都會(huì)被代理,在代理中,實(shí)現(xiàn)緩存的查詢(xún)與設(shè)置操作。

Cache 基礎(chǔ)設(shè)施的創(chuàng)建

上一篇(Spring AOP 模塊概述)談到過(guò),Spring AOP的創(chuàng)建過(guò)程,本質(zhì)是實(shí)現(xiàn)了一個(gè)BeanPostProcessor,在創(chuàng)建bean的過(guò)程中創(chuàng)建proxy,并且為proxy綁定所有適用于該bean的advisor,最終暴露給容器。

Spring中AOP主幾個(gè)關(guān)鍵的概念 advisor  advice pointcut

advice = 切面攔截中插入的行為

pointcut = 切面的切入點(diǎn)

advisor = advice + pointcut

Spring cache也同樣與其它aop有類(lèi)似的過(guò)程

創(chuàng)建 cache proxy

  • 由InfrastructureAdvisorAutoProxyCreator負(fù)責(zé)的,它實(shí)現(xiàn)BeanPostProcessor所以可以在bean實(shí)例化返回給容器前有機(jī)會(huì)創(chuàng)建代理,它又繼承了AbstractAdvisorAutoProxyCreator,所以又具備了給代理類(lèi)綁定advisor的能力。
  • pointcut的職責(zé)是由CacheOperationSourcePointcut完成的,它主要是通過(guò)方法上的cache相關(guān)的注解來(lái)判斷匹配是否需要切入

Cache的攔截行

Spring cache中生成cache代理對(duì)象使用的是CacheProxyFactoryBean工廠(chǎng)類(lèi)。一般來(lái)說(shuō),在Spring中標(biāo)準(zhǔn)代理的創(chuàng)建都是基于ProxyFactoryBean,在這里,為了更方便的處理cache邏輯,Spring引入了CacheProxyFactoryBean來(lái)專(zhuān)門(mén)表示cache相關(guān)的代理,cache proxy能wrapper單例目標(biāo)對(duì)象,并且代理目標(biāo)對(duì)象實(shí)現(xiàn)的所有接口。

可以看到,在CacheProxyFactoryBean中,有個(gè)重要的屬性是CacheInterceptor,這個(gè)類(lèi)是一個(gè)MethodInterceptor的實(shí)現(xiàn)類(lèi),這個(gè)類(lèi)的職責(zé)是在目標(biāo)對(duì)象目標(biāo)方法上執(zhí)行具體緩存操作,這也就是上面提到的advice的職責(zé)。

繼續(xù)往下跟,return 的execute方法是父類(lèi)CacheAspectSupport中的方法


在這個(gè)方法里,我們最終找到的操作緩存的最終邏輯

  • 判斷緩存條件
  • 獲取key
  • 獲取cache
  • 最終調(diào)用cache.get(key, Callable)方法,第二個(gè)參數(shù)是一個(gè)回調(diào),用于處理沒(méi)有命中緩存的情況:
    if cached, return; otherwise create, cache and return

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • SpringBoot自定義全局異常處理器的問(wèn)題總結(jié)

    SpringBoot自定義全局異常處理器的問(wèn)題總結(jié)

    Springboot框架提供兩個(gè)注解幫助我們十分方便實(shí)現(xiàn)全局異常處理器以及自定義異常,處理器會(huì)優(yōu)先處理更具體的異常類(lèi)型,如果沒(méi)有找到匹配的處理器,那么它會(huì)尋找處理更一般異常類(lèi)型的處理器,本文介紹SpringBoot自定義全局異常處理器的問(wèn)題,一起看看吧
    2024-01-01
  • 完整的logback配置示例ELK整合包含生成json日志

    完整的logback配置示例ELK整合包含生成json日志

    這篇文章主要為大家介紹了完整的logback配置示例ELK整合包含生成json日志,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Springboot參數(shù)校驗(yàn)之分組校驗(yàn)、嵌套校驗(yàn)的實(shí)現(xiàn)

    Springboot參數(shù)校驗(yàn)之分組校驗(yàn)、嵌套校驗(yàn)的實(shí)現(xiàn)

    日常開(kāi)發(fā)中,免不了需要對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn),諸如判空,長(zhǎng)度,正則,集合等,復(fù)雜一點(diǎn)的請(qǐng)求參數(shù)可能會(huì)包含嵌套,分組校驗(yàn),本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2023-08-08
  • IDEA自動(dòng)生成TestNG的testng.xml的插件方法

    IDEA自動(dòng)生成TestNG的testng.xml的插件方法

    這篇文章主要介紹了IDEA自動(dòng)生成TestNG的testng.xml的插件方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java實(shí)戰(zhàn)角色權(quán)限后臺(tái)腳手架系統(tǒng)的實(shí)現(xiàn)流程

    Java實(shí)戰(zhàn)角色權(quán)限后臺(tái)腳手架系統(tǒng)的實(shí)現(xiàn)流程

    只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+myBaits-Plus+Vue+Element-UI+Mysql實(shí)現(xiàn)一個(gè)角色權(quán)限后臺(tái)腳手架系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • 在Spring Boot中如何使用log4j記錄日志

    在Spring Boot中如何使用log4j記錄日志

    這篇文章主要介紹如何在spring boot中引入log4j,以及一些基礎(chǔ)用法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • 詳解Java Web如何限制訪(fǎng)問(wèn)的IP的兩種方法

    詳解Java Web如何限制訪(fǎng)問(wèn)的IP的兩種方法

    這篇文章主要介紹了詳解Java Web如何限制訪(fǎng)問(wèn)的IP的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • maven實(shí)現(xiàn)docker自動(dòng)化部署插件的使用

    maven實(shí)現(xiàn)docker自動(dòng)化部署插件的使用

    本文主要介紹了maven實(shí)現(xiàn)docker自動(dòng)化部署插件的使用,分享給大家,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Spring的@Autowired加到接口上但獲取的是實(shí)現(xiàn)類(lèi)的問(wèn)題

    Spring的@Autowired加到接口上但獲取的是實(shí)現(xiàn)類(lèi)的問(wèn)題

    這篇文章主要介紹了Spring的@Autowired加到接口上但獲取的是實(shí)現(xiàn)類(lèi)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Activiti如何動(dòng)態(tài)獲取流程圖過(guò)程詳解

    Activiti如何動(dòng)態(tài)獲取流程圖過(guò)程詳解

    這篇文章主要介紹了Activiti如何動(dòng)態(tài)獲取流程圖過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論