SpringBoot-Cache 集合 EhCache

shop000發表於2018-04-16

<!-- 快取 -->
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

ehcache.xml

<ehcache>
    <!-- 指定一個檔案目錄,當EHCache把資料寫到硬碟上時,將把資料寫到這個檔案目錄下 -->
    <diskStore path="java.io.tmpdir"/>

    <!-- 設定快取的預設資料過期策略 -->
    
    <cache name="person" maxElementsInMemory="10000" />
 
    
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="10"
            timeToLiveSeconds="120"
            diskPersistent="false"
            memoryStoreEvictionPolicy="LRU"
            diskExpiryThreadIntervalSeconds="120"/>

    <!-- maxElementsInMemory 記憶體中最大快取物件數,看著自己的heap大小來搞 -->
    <!-- eternal:true表示物件永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,預設為false -->
    <!-- maxElementsOnDisk:硬碟中最大快取物件數,若是0表示無窮大 -->
    <!-- overflowToDisk:true表示當記憶體快取的物件數目達到了maxElementsInMemory界限後,
    會把溢位的物件寫到硬碟快取中。注意:如果快取的物件要寫入到硬碟中的話,則該物件必須實現了Serializable介面才行。-->
    <!-- diskSpoolBufferSizeMB:磁碟快取區大小,預設為30MB。每個Cache都應該有自己的一個快取區。-->
    <!-- diskPersistent:是否快取虛擬機器重啟期資料  -->
    <!-- diskExpiryThreadIntervalSeconds:磁碟失效執行緒執行時間間隔,預設為120秒 -->

    <!-- timeToIdleSeconds: 設定允許物件處於空閒狀態的最長時間,以秒為單位。當物件自從最近一次被訪問後,
    如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個物件就會過期,
    EHCache將把它從快取中清空。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,
    則表示物件可以無限期地處於空閒狀態 -->

    <!-- timeToLiveSeconds:設定物件允許存在於快取中的最長時間,以秒為單位。當物件自從被存放到快取中後,
    如果處於快取中的時間超過了 timeToLiveSeconds屬性值,這個物件就會過期,
    EHCache將把它從快取中清除。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,
    則表示物件可以無限期地存在於快取中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,才有意義 -->

    <!-- memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,
    Ehcache將會根據指定的策略去清理記憶體。可選策略有:LRU(最近最少使用,預設策略)、
    FIFO(先進先出)、LFU(最少訪問次數)。-->

</ehcache>

application.properties:
spring.cache.type=ehcache
spring.cache.ehcache.config=ehcache.xml

在配置類配置@EnableCaching
@SpringBootApplication(exclude = MybatisAutoConfiguration.class)
@EnableCaching
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
管理設定
@Configuration
public class CacheConfiguration {
    @Bean(name = "appEhCacheCacheManager")
    public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){
    	System.out.println("-------啟動ehche-----");
        return new EhCacheCacheManager(bean.getObject());
    }
    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){
        EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean ();
        cacheManagerFactoryBean.setConfigLocation(new ClassPathResource ("ehcache.xml"));
        cacheManagerFactoryBean.setShared(true);
        return cacheManagerFactoryBean;
    }
}
測試
    @Cacheable(value = "person",key="#person.age")
    public Person getPerson(Person person) {
        Person p = personMapper.getPerson(person);
        return p;
    }
OK

相關文章