您好,登錄后才能下訂單哦!
這篇文章主要介紹spring緩存的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
具體介紹如下。
高速緩存一直是一個非常需要這兩個提高應(yīng)用程序性能并降低其工作量。此外,它的用處今天是特別明顯,可以作出處理成千上萬的游客concurrents.D'un架構(gòu)上的Web應(yīng)用,高速緩存管理正交于應(yīng)用程序的業(yè)務(wù)邏輯和出于這個原因,應(yīng)該對應(yīng)用程序本身的發(fā)展產(chǎn)生的影響最小。從3.1版本開始,Spring提供了高速緩存管理的API,類似聲明式事務(wù)管理。緩存的抽象接口,統(tǒng)一使用不同的緩存解決方案,對代碼的影響最小。
spring用Java方法,對帶有參數(shù)的組合第一次請求到一個方法,spring將返回值存儲在高速緩存中。因此,下一個請求將是直接使用從高速緩存的值,而不必調(diào)用可能的高代價的方法。一切都透明地施加,而不會影響調(diào)用的方法。
在這篇文章中,我們將看到與Spring的兩個不同的緩存存儲的實現(xiàn)。
Java的ConcurrentHashMap
Ehcache
spring和緩存的整合是簡單透明的,通過@Cacheable注解標(biāo)注需要緩存的方法
@Cacheable(value= "dataCache") public Reponse getDatas(Long param1, String param2){ }
dataCache是相關(guān)聯(lián)的高速緩存的名稱。第一次調(diào)用這個方法的時候,該方法執(zhí)行并將執(zhí)行的結(jié)果存入以<參數(shù)1,參數(shù)2>哈希出來的秘鑰為結(jié)果的結(jié)果集中去,當(dāng)使用同樣的參數(shù)再次調(diào)用的時候,這個方法不需要再次的執(zhí)行。
有可能多于一個的緩存關(guān)聯(lián)到我們的方法
@Cacheable({"dataCache",”default”}) public Reponse getDatas(Long param1, String param2){ }
在這種情況下,每個緩存都會在方法執(zhí)行之前檢查,如果有命中的話,則相關(guān)的值會被返回。
一個緩存管理器的基本算法的占比比較小。緩存可以看做是一個存儲器區(qū)域,在其中存儲的對象個由唯一的秘鑰進(jìn)行映射。對象搜索的過程如下:
1、計算key(利用hash方法得到hashcode)
2、根據(jù)key值查找對象
3、如果找到對象返回該結(jié)果
4、如果找不到,則會計算實際與對象相關(guān)連的key,并把對象存入相應(yīng)的位置
spring使用的是簡單的哈希,它根據(jù)傳遞的方法參數(shù)生成key
目標(biāo)方法不能簡單的根據(jù)參數(shù)產(chǎn)生不用的key,根據(jù)參數(shù)生成的僅僅是一些簡單的情況
@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){ }
上邊的這種情況,緩存計算的秘鑰的參數(shù)就僅僅是Parma2
spring也允許使用嵌套的屬性
@Cacheable(value="dataCache", key=#param2.name") public Reponse getDatas(Long param1, Data param2, boolean param3){}
這種情況就是根據(jù)Parma2的name屬性計算的秘鑰
有一個緩存可能不適用于所用情況下的緩存,但是在某一些情況下需要緩存,緩存的時候根據(jù)SPEL表達(dá)式計算的真假來進(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ù)诙€參數(shù)的長度小于64的時候才會進(jìn)行緩存
spring的緩存不僅僅可以將數(shù)據(jù)進(jìn)行緩存還可以清除緩存一個緩存存儲。該過程用于去除過時的數(shù)據(jù)或不用的緩存數(shù)據(jù)。注解@ CacheEvict定義了執(zhí)行緩存清空的方法,這些是刪除緩存中數(shù)據(jù)的觸發(fā)器。
@CacheEvict(value= "dataCache") public void reloadData(){ }
這個選項是非常有必要的,當(dāng)一個緩存的數(shù)據(jù)的需要清空的時候就會用到這個方法。
要啟用一個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 { }
技術(shù)限制
對象傳遞方法的參數(shù)必須有自己的hashcode方法,以便用來計算秘鑰
作為參數(shù)傳遞和返回的對象,它應(yīng)該是可以序列化的
實現(xiàn)選擇
spring提供了兩種基本的實現(xiàn):
java的concurrentHashMap
Ehcache
使用它們的時候,只需要聲明適當(dāng)?shù)腃acheManger和管理器的實體
使用java的ConcurrentHashMap
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <span > </span><property name="caches"> <span > </span><set> <span > </span><bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" name="default"/> <span > </span><bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" name="dataCache"/> <span > </span></set> <span > </span></property> </bean>
每個Manger都需要一個名稱,通過注釋來識別它。人們可以由一個Manger管理多個SimpleCacheManger,這個實現(xiàn)很基本不需要而外的庫。
實現(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的,我們可以在一個非常簡單的方式定義多個高速緩存不同的參數(shù)
名稱:高速緩存的標(biāo)識符
maxBytesLocalHeap:定義高速緩存可以使用虛擬機(jī)的字節(jié)數(shù)。如果一個的CacheManager maxBytesLocalHeap已經(jīng)設(shè)置,則高速緩存的所確定的尺寸將被減去的CacheManager。其他緩存共享的休息。此屬性的值是數(shù)據(jù)<編號> K | K | M | M | G | G代表千字節(jié)(K | K),兆字節(jié)(M | M)或千兆字節(jié)(G | G)。
永恒:定義元素是否是永恒的。如果是這樣的情況下,超時將被忽略,該項目是永不過期。
timeToIdleSeconds:這是秒數(shù),該項目自從他上次utilisation.La默認(rèn)值為0住,元素保持靜止
timeToLiveSeconds:這是秒數(shù)該項目已住自cache.La默認(rèn)價值創(chuàng)造為0,該項目將永遠(yuǎn)活著。
memoryStoreEvictionPolicy掠奪政策:LRU - 最近最少使用,不經(jīng)常使用的FIFO -先入先出,按創(chuàng)建日期最古老的元素。
diskExpiryThreadIntervalSeconds:的止贖過程控制兩個運行之間的秒數(shù)。
diskPersistent:允許存儲在磁盤上的虛擬機(jī)的兩場比賽間的對象恢復(fù)對象。
overflowToDisk:確定對象是否可以被存儲在磁盤上的情況下達(dá)到最大的存儲元件的
總結(jié)用一個簡單的數(shù)學(xué)公式:expirationTime = Math.min((creationTime + timeToLive),(mostRecentTime + timeToIdle))
以上是“spring緩存的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。