spring緩衝代碼詳解,spring緩衝詳解

來源:互聯網
上載者:User

spring緩衝代碼詳解,spring緩衝詳解

本文研究的主要是spring緩衝的相關內容,具體介紹如下。

這篇文章是根據Google翻譯大致修改出來的,由於原文不知道是什麼語,所以可能導致翻譯的有錯誤和不準確的地方,但是大致的方向感覺還是蠻不錯的,所以在這裡整理了一下,希望能夠有所協助。

快取一直是一個非常需要這兩個提高應用程式效能並降低其工作量。此外,它的用處今天是特別明顯,可以作出處理成千上萬的遊客concurrents.D'un架構上的Web應用,快取管理正交於應用程式的商務邏輯和出於這個原因,應該對應用程式本身的發展產生的影響最小。從3.1版本開始,Spring提供了快取管理的API,類似聲明式交易管理。緩衝的抽象介面,統一使用不同的緩衝解決方案,對代碼的影響最小。

spring用Java方法,對帶有參數的組合第一次請求到一個方法,spring將傳回值儲存在快取中。因此,下一個請求將是直接使用從快取的值,而不必調用可能的高代價的方法。一切都透明地施加,而不會影響調用的方法。
在這篇文章中,我們將看到與Spring的兩個不同的緩衝儲存的實現。

  • Java的ConcurrentHashMap
  • Ehcache
實現

spring和緩衝的整合是簡單透明的,通過@Cacheable註解標註需要緩衝的方法

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

dataCache是相關聯的快取的名稱。第一次調用這個方法的時候,該方法執行並將執行的結果存入以<參數1,參數2>雜湊出來的秘鑰為結果的結果集中去,當使用同樣的參數再次調用的時候,這個方法不需要再次的執行。

有可能多於一個的緩衝關聯到我們的方法

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

在這種情況下,每個緩衝都會在方法執行之前檢查,如果有命中的話,則相關的值會被返回。

產生緩衝鍵

一個緩衝管理器的基本演算法的佔比比較小。緩衝可以看做是一個儲存空間地區,在其中儲存的對象個由唯一的秘鑰進行映射。對象搜尋的過程如下:

1、計算key(利用hash方法得到hashcode)
2、根據key值尋找對象
3、如果找到對象返回該結果
4、如果找不到,則會計算實際與對象相關連的key,並把對象存入相應的位置

spring使用的是簡單的雜湊,它根據傳遞的方法參數產生key

自訂緩衝

目標方法不能簡單的根據參數產生不用的key,根據參數產生的僅僅是一些簡單的情況

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

@Cacheable是允許開發人員自己指定key產生的方式的,可以使用spel運算式來做這件事情

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

上邊的這種情況,緩衝計算的秘鑰的參數就僅僅是Parma2

spring也允許使用嵌套的屬性

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

這種情況就是根據Parma2的name屬性計算的秘鑰

條件緩衝

有一個緩衝可能不適用於所用情況下的緩衝,但是在某一些情況下需要緩衝,緩衝的時候根據SPEL運算式計算的真假來進行緩衝的處理,如果條件為真的情況下則進行緩衝

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

在這種情況下是僅僅當第二個參數的長度小於64的時候才會進行緩衝

@CacheEvict註解

spring的緩衝不僅僅可以將資料進行緩衝還可以清除緩衝一個緩衝儲存。該過程用於去除過時的資料或不用的快取資料。註解@ CacheEvict定義了執行緩衝清空的方法,這些是刪除緩衝中資料的觸發器。

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

這個選項是非常有必要的,當一個緩衝的資料的需要清空的時候就會用到這個方法。

啟用緩衝

要啟用一個spring項目對緩衝的支援,我們需要再命名空間上增加對緩衝注釋的語句

<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 /> 

刪除註解可以禁用緩衝,也可在我們的配置類中啟用對緩衝的使用

@Configuration   @EnableCaching   public class AppConfig {  } 

技術限制

對象傳遞方法的參數必須有自己的hashcode方法,以便用來計算秘鑰

作為參數傳遞和返回的對象,它應該是可以序列化的

實現選擇

spring提供了兩種基本的實現:

  1. java的concurrentHashMap
  2. Ehcache

使用它們的時候,只需要聲明適當的CacheManger和管理器的實體

使用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> 

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

實現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中檔案是應用程式緩衝參數檔案:

<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的,我們可以在一個非常簡單的方式定義多個快取不同的參數

名稱:快取的標識符

maxBytesLocalHeap:定義快取可以使用虛擬機器的位元組數。如果一個的CacheManager maxBytesLocalHeap已經設定,則快取的所確定的尺寸將被減去的CacheManager。其他緩衝共用的休息。此屬性的值是資料<編號> K | K | M | M | G | G代表KB(K | K),MB(M | M)或千MB(G | G)。

永恒:定義元素是否是永恒的。如果是這樣的情況下,逾時將被忽略,該項目是永不到期。
timeToIdleSeconds:這是秒數,該項目自從他上次utilisation.La預設值為0住,元素保持靜止
timeToLiveSeconds:這是秒數該項目已住自cache.La預設價值創造為0,該項目將永遠活著。
memoryStoreEvictionPolicy掠奪政策:LRU - 最近最少使用,不經常使用的FIFO -先入先出,按建立日期最古老的元素。
diskExpiryThreadIntervalSeconds:的止贖過程式控制制兩個運行之間的秒數。
diskPersistent:允許儲存在磁碟上的虛擬機器的兩場比賽間的對象恢複對象。
overflowToDisk:確定對象是否可以被儲存在磁碟上的情況下達到最大的儲存元件的

總結用一個簡單的數學公式:expirationTime = Math.min((creationTime + timeToLive),(mostRecentTime + timeToIdle))

總結

以上就是本文關於spring緩衝代碼詳解的全部內容,希望對大家有所協助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.