前言
JAVA緩存實現(xiàn)方案有很多朽色,最基本的自己使用Map去構建緩存麸拄,或者使用memcached或Redis征绸,但是上述兩種緩存框架都要搭建服務器克锣,而Map自行構建的緩存可能沒有很高的使用效率赖晶,那么我們可以嘗試一下使用Ehcache緩存框架律适。
Ehcache主要基于內(nèi)存緩存,磁盤緩存為輔的遏插,使用起來方便捂贿。下面介紹如何在項目中使用Ehcache
入門使用教程
1.maven引用
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.4</version>
</dependency>
2.在classpath下建立一個ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--timeToIdleSeconds 當緩存閑置n秒后銷毀 -->
<!--timeToLiveSeconds 當緩存存活n秒后銷毀 -->
<!--
緩存配置
name:緩存名稱。
maxElementsInMemory:緩存最大個數(shù)涩堤。
eternal:對象是否永久有效眷蜓,一但設置了,timeout將不起作用胎围。
timeToIdleSeconds:設置對象在失效前的允許閑置時間(單位:秒)吁系。僅當eternal=false對象不是永久有效時使用,可選屬性白魂,默認值是0汽纤,也就是可閑置時間無窮大。
timeToLiveSeconds:設置對象在失效前允許存活時間(單位:秒)福荸。最大時間介于創(chuàng)建時間和失效時間之間蕴坪。僅當eternal=false對象不是永久有效時使用,默認是0.敬锐,也就是對象存活時間無窮大背传。
overflowToDisk:當內(nèi)存中對象數(shù)量達到maxElementsInMemory時,Ehcache將會對象寫到磁盤中台夺。
diskSpoolBufferSizeMB:這個參數(shù)設置DiskStore(磁盤緩存)的緩存區(qū)大小径玖。默認是30MB。每個Cache都應該有自己的一個緩沖區(qū)颤介。
maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)梳星。
diskPersistent:是否緩存虛擬機重啟期數(shù)據(jù) Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔赞赖,默認是120秒。
memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時冤灾,Ehcache將會根據(jù)指定的策略去清理內(nèi)存前域。默認策略是LRU(最近最少使用)。你可以設置為FIFO(先進先出)或是LFU(較少使用)韵吨。
clearOnFlush:內(nèi)存數(shù)量最大時是否清除匿垄。
-->
<!-- 磁盤緩存位置 -->
<diskStore path="java.io.tmpdir/easylink-mall-web/ehcache"/>
<!-- 默認緩存 -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- 商戶申請數(shù)據(jù)緩存 數(shù)據(jù)緩存40分鐘 -->
<cache
name="merchant-apply-cache"
eternal="false"
timeToIdleSeconds="2400"
timeToLiveSeconds="2400"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU">
</cache>
</ehcache>
3.與spring的cacheManager結合使用
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<!-- 支持緩存注解 -->
<cache:annotation-driven cache-manager="cacheManager" />
<!-- 默認是cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="cacheManagerFactory"/>
</bean>
<!-- cache管理器配置 -->
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
<property name="shared" value="true" />
</bean>
</beans>
4.代碼使用
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.baomidou.mybatisplus.toolkit.IdWorker;
import com.easylink.mall.entity.Merchant;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/spring.xml")
public class EhcacheTest {
@Autowired
private CacheManager cacheManager;
@Test
public void execute() {
// 獲取商戶申請緩存容器
Cache cache = cacheManager.getCache("merchant-apply-cache");
Merchant merchant = new Merchant();
Long id = IdWorker.getId();
merchant.setId(id);
merchant.setName("緩存測試");
// 將商戶申請數(shù)據(jù)添加至緩存中 // key : id value : object
cache.put(id, merchant);
// 獲取商戶申請數(shù)據(jù)
// 方法1
Merchant cacheMerchant1 = (Merchant) cache.get(id).get();
System.out.println(cacheMerchant1.getName());
// 方法2
Merchant cacheMerchant2 = cache.get(id, Merchant.class);
System.out.println(cacheMerchant2.getName());
// 將商戶申請數(shù)據(jù)從緩存中移除
cache.evict(id);
}
}
5.注意事項
cache.get(key) 和cache.get(key, class);方法,由于不知道你存入的key是什么類型学赛,所以get的時候不會做key的類型檢查年堆,如上述例子中
Long id = IdWorker.getId();
cache.put(id, merchant);
Merchant cacheMerchant2 = cache.get(id, Merchant.class);
put進去時的key是Long類型的,get的時候也只能傳入對應Long類型的key才能獲取到對應的value盏浇,如果傳入的是String類型的key变丧,即使兩個key的值是一致的,也會導致無法獲取到對應的value绢掰。這個情況很容易發(fā)生在對request請求的參數(shù)痒蓬,由于是String字符串類型,但是忘了做類型轉(zhuǎn)換就直接把這個String當做key去獲取對應的value滴劲。導致獲取不到攻晒,請同學們要注意,親身經(jīng)歷班挖,血與淚的教訓鲁捏。
總結
以上就是我自己總結的Ehcache入門級用法,Ehcache是個不錯的內(nèi)存緩存框架萧芙,如果沒使用過的話给梅,可以嘗試使用。