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

spring緩存代碼詳解

 更新時(shí)間:2018年02月02日 14:47:06   作者:txxs  
這篇文章主要介紹了spring緩存代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文研究的主要是spring緩存的相關(guān)內(nèi)容,具體介紹如下。

這篇文章是根據(jù)谷歌翻譯大致修改出來的,由于原文不知道是什么語,所以可能導(dǎo)致翻譯的有錯(cuò)誤和不準(zhǔn)確的地方,但是大致的方向感覺還是蠻不錯(cuò)的,所以在這里整理了一下,希望能夠有所幫助。

高速緩存一直是一個(gè)非常需要這兩個(gè)提高應(yīng)用程序性能并降低其工作量。此外,它的用處今天是特別明顯,可以作出處理成千上萬的游客concurrents.D'un架構(gòu)上的Web應(yīng)用,高速緩存管理正交于應(yīng)用程序的業(yè)務(wù)邏輯和出于這個(gè)原因,應(yīng)該對(duì)應(yīng)用程序本身的發(fā)展產(chǎn)生的影響最小。從3.1版本開始,Spring提供了高速緩存管理的API,類似聲明式事務(wù)管理。緩存的抽象接口,統(tǒng)一使用不同的緩存解決方案,對(duì)代碼的影響最小。

spring用Java方法,對(duì)帶有參數(shù)的組合第一次請(qǐng)求到一個(gè)方法,spring將返回值存儲(chǔ)在高速緩存中。因此,下一個(gè)請(qǐng)求將是直接使用從高速緩存的值,而不必調(diào)用可能的高代價(jià)的方法。一切都透明地施加,而不會(huì)影響調(diào)用的方法。
在這篇文章中,我們將看到與Spring的兩個(gè)不同的緩存存儲(chǔ)的實(shí)現(xiàn)。

  • Java的ConcurrentHashMap
  • Ehcache

實(shí)現(xiàn)

spring和緩存的整合是簡(jiǎn)單透明的,通過@Cacheable注解標(biāo)注需要緩存的方法

@Cacheable(value= "dataCache")  
public Reponse getDatas(Long param1, String param2){ } 

dataCache是相關(guān)聯(lián)的高速緩存的名稱。第一次調(diào)用這個(gè)方法的時(shí)候,該方法執(zhí)行并將執(zhí)行的結(jié)果存入以<參數(shù)1,參數(shù)2>哈希出來的秘鑰為結(jié)果的結(jié)果集中去,當(dāng)使用同樣的參數(shù)再次調(diào)用的時(shí)候,這個(gè)方法不需要再次的執(zhí)行。

有可能多于一個(gè)的緩存關(guān)聯(lián)到我們的方法

@Cacheable({"dataCache",”default”})   
public Reponse getDatas(Long param1, String param2){  } 

在這種情況下,每個(gè)緩存都會(huì)在方法執(zhí)行之前檢查,如果有命中的話,則相關(guān)的值會(huì)被返回。

生成緩存鍵

一個(gè)緩存管理器的基本算法的占比比較小。緩存可以看做是一個(gè)存儲(chǔ)器區(qū)域,在其中存儲(chǔ)的對(duì)象個(gè)由唯一的秘鑰進(jìn)行映射。對(duì)象搜索的過程如下:

1、計(jì)算key(利用hash方法得到hashcode)
2、根據(jù)key值查找對(duì)象
3、如果找到對(duì)象返回該結(jié)果
4、如果找不到,則會(huì)計(jì)算實(shí)際與對(duì)象相關(guān)連的key,并把對(duì)象存入相應(yīng)的位置

spring使用的是簡(jiǎn)單的哈希,它根據(jù)傳遞的方法參數(shù)生成key

自定義緩存

目標(biāo)方法不能簡(jiǎn)單的根據(jù)參數(shù)產(chǎn)生不用的key,根據(jù)參數(shù)生成的僅僅是一些簡(jiǎn)單的情況

@Cacheable(value= "dataCache")   
public Reponse getDatas(Long param1, String param2, boolean param3){  } 

@Cacheable是允許開發(fā)人員自己指定key生成的方式的,可以使用spel表達(dá)式來做這件事情

@Cacheable(value= "dataCache", key="#param2")   
public Reponse getDatas(Long param1, String param2, boolean param3){   } 

上邊的這種情況,緩存計(jì)算的秘鑰的參數(shù)就僅僅是Parma2

spring也允許使用嵌套的屬性

@Cacheable(value="dataCache", key=#param2.name")  
 public Reponse getDatas(Long param1, Data param2, boolean param3){} 

這種情況就是根據(jù)Parma2的name屬性計(jì)算的秘鑰

條件緩存

有一個(gè)緩存可能不適用于所用情況下的緩存,但是在某一些情況下需要緩存,緩存的時(shí)候根據(jù)SPEL表達(dá)式計(jì)算的真假來進(jìn)行緩存的處理,如果條件為真的情況下則進(jìn)行緩存

@Cacheable(value= "dataCache", key="#param2", condition="#param2.length<64")   
public Reponse getDatas(Long param1, String param2, boolean param3){  } 

在這種情況下是僅僅當(dāng)?shù)诙€(gè)參數(shù)的長(zhǎng)度小于64的時(shí)候才會(huì)進(jìn)行緩存

@CacheEvict注解

spring的緩存不僅僅可以將數(shù)據(jù)進(jìn)行緩存還可以清除緩存一個(gè)緩存存儲(chǔ)。該過程用于去除過時(shí)的數(shù)據(jù)或不用的緩存數(shù)據(jù)。注解@ CacheEvict定義了執(zhí)行緩存清空的方法,這些是刪除緩存中數(shù)據(jù)的觸發(fā)器。

@CacheEvict(value= "dataCache")   
public void reloadData(){  } 

這個(gè)選項(xiàng)是非常有必要的,當(dāng)一個(gè)緩存的數(shù)據(jù)的需要清空的時(shí)候就會(huì)用到這個(gè)方法。

啟用緩存

要啟用一個(gè)spring項(xiàng)目對(duì)緩存的支持,我們需要再命名空間上增加對(duì)緩存注釋的語句

<beans xmlns="http://www.springframework.org/schema/beans"     
    xmlns:cache="http://www.springframework.org/schema/cache"     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
    xmlns:context="http://www.springframework.org/schema/context"     
    xsi:schemaLocation="http://www.springframework.org/schema/beans       
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd       
    http://www.springframework.org/schema/cache       
    http://www.springframework.org/schema/cache/spring-cache.xsd       
    http://www.springframework.org/schema/context">   
  
<cache:annotation-driven /> 

刪除注解可以禁用緩存,也可在我們的配置類中啟用對(duì)緩存的使用

@Configuration   
@EnableCaching   
public class AppConfig {  } 

技術(shù)限制

對(duì)象傳遞方法的參數(shù)必須有自己的hashcode方法,以便用來計(jì)算秘鑰

作為參數(shù)傳遞和返回的對(duì)象,它應(yīng)該是可以序列化的

實(shí)現(xiàn)選擇

spring提供了兩種基本的實(shí)現(xiàn):

  1. java的concurrentHashMap
  2. Ehcache

使用它們的時(shí)候,只需要聲明適當(dāng)?shù)腃acheManger和管理器的實(shí)體

使用java的ConcurrentHashMap

<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">   
<span style="white-space:pre">  </span><property name="caches">   
<span style="white-space:pre">    </span><set>   
<span style="white-space:pre">      </span><bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" name="default"/>   
<span style="white-space:pre">      </span><bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" name="dataCache"/>   
<span style="white-space:pre">    </span></set>   
<span style="white-space:pre">  </span></property>   
</bean> 

每個(gè)Manger都需要一個(gè)名稱,通過注釋來識(shí)別它。人們可以由一個(gè)Manger管理多個(gè)SimpleCacheManger,這個(gè)實(shí)現(xiàn)很基本不需要而外的庫。

實(shí)現(xiàn)Ehcache

聲明CacheManger

bean id="cacheManager"    
class="org.springframework.cache.ehcache.EhCacheCacheManager">   
 <property name="cacheManager" ref="ehcache"/>   
</bean>   
  
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
 <property name="configLocation" value="classpath:ehcache.xml"/>  
 <property name="shared" value="true"/>   
</bean> 

在ehcache.xml中文件是應(yīng)用程序緩存參數(shù)文件:

<ehcache xsi:noNamespaceSchemaLocation="ehcache.xsd"    
  updateCheck="true"    
  monitoring="autodetect"    
  dynamicConfig="true"    
  maxBytesLocalHeap="150M">  
  
  <diskStore path="java.io.tmpdir"/>   
  <defaultCache eternal="false"  
   maxElementsInMemory="100"    
   overflowToDisk="false"/>  
  
  <cache name="dataCache"  
   eternal="false" 
   timeToIdleSeconds="300" 
   maxBytesLocalHeap="30M" 
   timeToLiveSeconds="300" 
   overflowToDisk="true" 
   diskPersistent="false" 
   diskExpiryThreadIntervalSeconds="120" 
   memoryStoreEvictionPolicy="LRU"/> 
  </ehcache> 

使用ehcache的,我們可以在一個(gè)非常簡(jiǎn)單的方式定義多個(gè)高速緩存不同的參數(shù)

名稱:高速緩存的標(biāo)識(shí)符

maxBytesLocalHeap:定義高速緩存可以使用虛擬機(jī)的字節(jié)數(shù)。如果一個(gè)的CacheManager maxBytesLocalHeap已經(jīng)設(shè)置,則高速緩存的所確定的尺寸將被減去的CacheManager。其他緩存共享的休息。此屬性的值是數(shù)據(jù)<編號(hào)> K | K | M | M | G | G代表千字節(jié)(K | K),兆字節(jié)(M | M)或千兆字節(jié)(G | G)。

永恒:定義元素是否是永恒的。如果是這樣的情況下,超時(shí)將被忽略,該項(xiàng)目是永不過期。
timeToIdleSeconds:這是秒數(shù),該項(xiàng)目自從他上次utilisation.La默認(rèn)值為0住,元素保持靜止
timeToLiveSeconds:這是秒數(shù)該項(xiàng)目已住自cache.La默認(rèn)價(jià)值創(chuàng)造為0,該項(xiàng)目將永遠(yuǎn)活著。
memoryStoreEvictionPolicy掠奪政策:LRU - 最近最少使用,不經(jīng)常使用的FIFO -先入先出,按創(chuàng)建日期最古老的元素。
diskExpiryThreadIntervalSeconds:的止贖過程控制兩個(gè)運(yùn)行之間的秒數(shù)。
diskPersistent:允許存儲(chǔ)在磁盤上的虛擬機(jī)的兩場(chǎng)比賽間的對(duì)象恢復(fù)對(duì)象。
overflowToDisk:確定對(duì)象是否可以被存儲(chǔ)在磁盤上的情況下達(dá)到最大的存儲(chǔ)元件的

總結(jié)用一個(gè)簡(jiǎn)單的數(shù)學(xué)公式:expirationTime = Math.min((creationTime + timeToLive),(mostRecentTime + timeToIdle))

總結(jié)

以上就是本文關(guān)于spring緩存代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • 應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法

    應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法

    這篇文章主要介紹了應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法,通過一個(gè)自定義函數(shù)結(jié)合泛型與反射的應(yīng)用實(shí)現(xiàn)導(dǎo)出CSV文件的功能,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • SpringBoot+Mybatis+Vue 實(shí)現(xiàn)商品模塊的crud操作

    SpringBoot+Mybatis+Vue 實(shí)現(xiàn)商品模塊的crud操作

    這篇文章主要介紹了SpringBoot+Mybatis+Vue 實(shí)現(xiàn)商品模塊的crud操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 基于spring注入為null的原因及解決方案

    基于spring注入為null的原因及解決方案

    這篇文章主要介紹了spring注入為null的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot集成mqtt的多模塊項(xiàng)目配置詳解

    SpringBoot集成mqtt的多模塊項(xiàng)目配置詳解

    這篇文章主要介紹了SpringBoot集成mqtt的多模塊項(xiàng)目配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java利用ffmpeg實(shí)現(xiàn)視頻MP4轉(zhuǎn)m3u8

    Java利用ffmpeg實(shí)現(xiàn)視頻MP4轉(zhuǎn)m3u8

    本文綜合了下網(wǎng)上教程,從ffmpeg工具轉(zhuǎn)碼,ffmpeg視頻播放,java語言操控ffmpeg轉(zhuǎn)碼,轉(zhuǎn)碼后視頻上傳阿里云oss,四個(gè)方面完整記錄下這個(gè)流程,需要的朋友可以參考下
    2024-02-02
  • Java Web監(jiān)聽器Listener接口原理及用法實(shí)例

    Java Web監(jiān)聽器Listener接口原理及用法實(shí)例

    這篇文章主要介紹了Java Web監(jiān)聽器Listener接口原理及用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • java在原字符中插入新字符或字符串實(shí)例

    java在原字符中插入新字符或字符串實(shí)例

    這篇文章主要介紹了java在原字符中插入新字符或字符串實(shí)例,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼

    java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)詳解及實(shí)例代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)單鏈表逆轉(zhuǎn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java多線程下解決數(shù)據(jù)安全問題

    Java多線程下解決數(shù)據(jù)安全問題

    這篇文章主要介紹了Java多線程下解決數(shù)據(jù)安全問題,本文使用代碼進(jìn)行講解,可供大家學(xué)習(xí)參考
    2021-08-08
  • Java多線程工具CompletableFuture詳解

    Java多線程工具CompletableFuture詳解

    這篇文章主要介紹了Java多線程工具CompletableFuture詳解,CompletableFuture?是?java?1.8?追加的新特性,通俗的話來說,是一個(gè)函數(shù)式的,用于控制多任務(wù)同步、異步組合操作的工具,需要的朋友可以參考下
    2024-01-01

最新評(píng)論