一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - spring緩存代碼詳解

spring緩存代碼詳解

2021-03-30 14:42txxs Java教程

這篇文章主要介紹了spring緩存代碼詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

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

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

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

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

  • Java的ConcurrentHashMap
  • Ehcache
  •  

實現

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

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

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

有可能多于一個的緩存關聯到我們的方法

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

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

生成緩存鍵

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

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

spring使用的是簡單的哈希,它根據傳遞的方法參數生成key

自定義緩存

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

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

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

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

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

spring也允許使用嵌套的屬性

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

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

條件緩存

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

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

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

@CacheEvict注解

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

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

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

啟用緩存

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

?
1
2
3
4
5
6
7
8
9
10
11
<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 />

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

?
1
2
3
@Configuration  
@EnableCaching  
public class AppConfig {  }

技術限制

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

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

實現選擇

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

  1. java的concurrentHashMap
  2. Ehcache

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

使用java的ConcurrentHashMap

?
1
2
3
4
5
6
7
8
<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

?
1
2
3
4
5
6
7
8
9
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中文件是應用程序緩存參數文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<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代表千字節(K | K),兆字節(M | M)或千兆字節(G | G)。

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

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

總結

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

原文鏈接:http://blog.csdn.net/maoyeqiu/article/details/50433934

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色就色综合 | 亚州vs欧州vs日 | 2020年新四虎免费 | 床戏小说| 欧美撒尿屁股嘘嘘撒尿 | 欧美军人男同69gay | 四虎影剧院 | 911福利视频| 亚洲黄色成人 | 四虎影视入口 | 日本亚欧乱色视频在线观看 | 91色香sxmv最网页版新地址 | 范冰冰上面好大下面好紧 | 三级理论在线观看 | 免费日本在线 | 日韩一区二区在线视频 | 2021国产麻豆剧传媒剧情 | 欧美老少 | 国产日韩欧美在线一区二区三区 | www.87福利| 乌克兰13一14娇小 | 国产精品视频色拍拍 | 天天色影视综合网 | 国产爽视频 | 青青草原社区 | 日本偷拍xxxxxxww | 天天操天天干天天舔 | 亚洲波多野结衣日韩在线 | 国产精品亚洲专区在线播放 | 日本高清免费看 | 99精品视频一区在线观看miya | 性导航h| 亚洲国产成人久久综合一区 | 成人福利影院 | 亚洲精品视| 欧美三级一区二区 | 236zz宅宅最新伦理 | 动漫美女被吸乳羞羞小说 | 亚洲不卡高清免v无码屋 | 高跟丝袜人妖sissy露出调教 | 好猛好紧好硬使劲好大刺激视频 |