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

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

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

Spring Cache 概念

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

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

其特點總結例如以下:

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

設計理念

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

org.springframework.cache.CacheManager

Cache代表緩存本身

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

使用Spring Cache分三步:

  • 聲明緩存
  • 開啟Spring的cache功能
  • 配置后端的存儲

聲明緩存

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

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

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

  • @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

開啟Spring Cache的支持

<cache:annotation-driven />

或者使用注解@EnableCaching的方式

配置緩存后端存儲

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

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

  • RedisCacheManager(來自于Spring Data Redis項目)
  • GmfireCacheManager(來自于Spring Data GemFire項目

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

緩存的key是如何生成

我們都知道緩存的存儲方式一般是key value的方式,那么在Spring cache里,key是如何被設置的呢,在這里要引入KeyGenerator,它負責key的生成策略,默認的使用SimpleKeyGenerator


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

Spring Cache的實現(xiàn)

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

在學習Spring源碼的時候,有兩點可以記住:

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

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

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

Cache 基礎設施的創(chuàng)建

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

Spring中AOP主幾個關鍵的概念 advisor  advice pointcut

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

pointcut = 切面的切入點

advisor = advice + pointcut

Spring cache也同樣與其它aop有類似的過程

創(chuàng)建 cache proxy

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

Cache的攔截行

Spring cache中生成cache代理對象使用的是CacheProxyFactoryBean工廠類。一般來說,在Spring中標準代理的創(chuàng)建都是基于ProxyFactoryBean,在這里,為了更方便的處理cache邏輯,Spring引入了CacheProxyFactoryBean來專門表示cache相關的代理,cache proxy能wrapper單例目標對象,并且代理目標對象實現(xiàn)的所有接口。

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

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


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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • JVM之方法返回地址詳解

    JVM之方法返回地址詳解

    這篇文章主要介紹了JVM之方法返回地址詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java實現(xiàn)簡易版圖形界面計算器

    java實現(xiàn)簡易版圖形界面計算器

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡易版圖形界面計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 聽說用了YYYY-MM-dd的程序員,前些天都在加班改Bug

    聽說用了YYYY-MM-dd的程序員,前些天都在加班改Bug

    這篇文章主要介紹了YYYY-MM-dd的實用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • java安全?ysoserial?CommonsCollections1示例解析

    java安全?ysoserial?CommonsCollections1示例解析

    這篇文章主要介紹了java安全?ysoserial?CommonsCollections1示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 使用maven打包生成doc文檔和打包源碼

    使用maven打包生成doc文檔和打包源碼

    這篇文章主要介紹了使用maven打包生成doc文檔和打包源碼的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot兩種配置文件properties和yml區(qū)別

    Spring Boot兩種配置文件properties和yml區(qū)別

    這篇文章主要為大家介紹了java面試中常見問到的Spring Boot兩種配置文件properties和yml區(qū)別解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • java實現(xiàn)Linux(centos) 中docker容器下命令交互的代碼(配置向導)

    java實現(xiàn)Linux(centos) 中docker容器下命令交互的代碼(配置向導)

    小編在開發(fā)項目時遇到個需求,因為系統(tǒng)部署每次都要多臺機器拆分部署,很麻煩,怎么配置比較方便呢,今天小編給大家介紹java實現(xiàn)Linux(centos) 中docker容器下命令交互的代碼(配置向導),感興趣的朋友一起看看吧
    2021-05-05
  • Java Stream流與使用操作指南

    Java Stream流與使用操作指南

    Stream不是數(shù)據(jù)結構,而是一種高級的數(shù)據(jù)處理工具,允許你以聲明式的方式處理數(shù)據(jù)集合,類似于SQL語句操作數(shù)據(jù)庫,本文給大家介紹Java Stream流與使用操作指南,感興趣的朋友一起看看吧
    2025-08-08
  • 初探Java內部類的使用

    初探Java內部類的使用

    Java內部類一般可以分為以下三種:成員內部類、靜態(tài)內部類和匿名內部類。這篇文章主要帶大家初探一下Java內部類的使用,感興趣的可以了解一下
    2022-09-09
  • 一篇文章帶你玩轉Spring bean的終極利器

    一篇文章帶你玩轉Spring bean的終極利器

    這篇文章主要給大家介紹了關于玩轉Spring bean的終極利器的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring bean具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05

最新評論

彰化市| 石渠县| 巴林左旗| 深泽县| 伊宁县| 京山县| 民丰县| 清原| 班戈县| 丹凤县| 班戈县| 宝山区| 广丰县| 牟定县| 武夷山市| 军事| 山阴县| 洞头县| 卓尼县| 睢宁县| 铜梁县| 嘉义市| 博爱县| 通渭县| 肃北| 宜兴市| SHOW| 莱芜市| 康定县| 黄大仙区| 华宁县| 乌拉特后旗| 武定县| 双牌县| 盈江县| 岚皋县| 镇安县| 莆田市| 三门县| 仪陇县| 固始县|