springMVC整合快取框架Ehcache
Ehcache算是當前比較流行的快取框架,使用快取可以極大的緩解伺服器和資料庫的壓力,提高訪問效率,提高伺服器的併發能力。接下來我們看怎麼把快取使用起來。
SpringMVC整合Ehcache所需的jar包:
包括ehcache-core-2.4.3.jar、ehcache-web-2.0.4.jar、guava-15.0.jar、slf4j-api-1.7.12.jar、commons-logging.jar
jar包下載地址http://download.csdn.net/detail/qq_33556185/9550460
將jar包放到專案裡之後,我們看怎麼整合它
(一)配置ehcahce.xml
updateCheck="false" 不檢查更新當前使用的Ehcache的版本
eternal:快取中物件是否為永久的,如果是,超時設定將被忽略,物件從不過期。
maxElementsInMemory:快取中允許建立的最大物件數
overflowToDisk:記憶體不足時,是否啟用磁碟快取。
timeToIdleSeconds:快取資料的鈍化時間,也就是在一個元素消亡之前,
兩次訪問時間的最大時間間隔值,這隻能在元素不是永久駐留時有效,
如果該值是 0 就意味著元素可以停頓無窮長的時間。
timeToLiveSeconds:快取資料的生存時間,也就是一個元素從構建到消亡的最大時間間隔值,
這隻能在元素不是永久駐留時有效,如果該值是0就意味著元素可以停頓無窮長的時間。
memoryStoreEvictionPolicy:快取滿了之後的淘汰演算法。
1 FIFO,先進先出
2 LFU,最少被使用,快取的元素有一個hit屬性,hit值最小的將會被清出快取。
3 LRU,最近最少使用的,快取的元素有一個時間戳,當快取容量滿了,而又需要騰出地方來快取新的元素的時候,那麼現有快取元素中時間戳離當前時間最遠的元素將被清出快取。
<?xml version="1.0"encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <!—預設快取--!> <defaultCache eternal="false" maxElementsInMemory="10000" overflowToDisk="false" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU"/> <!—自定義快取--!> <cache name="myCache" eternal="false" maxElementsInMemory="10000" overflowToDisk="false" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU"/> </ehcache>
(二)配置spring-common檔案
匯入名稱空間
xmlns:cache="http://www.springframework.org/schema/cache"
http://www.springframework.org/schema/cache
具體配置如下:
啟用快取註解功能
<cache:annotation-drivencache-manager="cacheManager"/>
快取管理器工廠載入ehcache的配置
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation"value="classpath:ehcache.xml"/>
</bean>
宣告快取管理器
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager"ref="cacheManagerFactory"/>
</bean>
到此環境已經搭建完成了。
接下來我們看怎麼使用
(三)使用@Cacheable註解來快取資料
當快取中沒有該物件的時候,當然要從資料庫裡面訪問了,從資料庫查出來之後,快取管理器會將此物件放到快取中,下一次訪問的時候,只要該物件沒有消亡,則會從快取裡去取,不會再去查資料庫
value為我們自定義快取的name,key的屬性是快取的key
@Cacheable(value="myCache",key="#userName")
@Override
public List<Permission>findPermissionByName(String userName) {
System.out.println("查資料庫了===========");
return permissionRepository.findPermissionByName(userName);
}
(四)使用@CachePut註解來更新快取
當快取中的物件被修改的時候,修改的方法使用該註解,快取管理器會根據key找到被修改的物件,然後去修改快取中的物件
@CachePut(value="myCache",key="#userId")//更新myCache 快取
@Override
public void savePermission(Permissionpermission) {
permissionRepository.savePermission(permission);
}
(五)使用@CacheEvict註解來清除快取
當物件被刪除的時候,我們需要去清除快取裡面存在的該物件,若不清除,資料庫裡已經刪除,可是快取裡還在,查詢的時候,該物件還是會查出來。
清除掉指定key的快取
@CacheEvict(value="myCache",key="#userName")
清除掉全部快取
@CacheEvict(value="myCache",allEntries=true)