spring cache、ehcache的使用及集成

項目中須要加緩存,故學習了java

一、spring cache、ehcache的使用及集成redis

二、緩存的命中率等統計數據spring

1、spring cache數據庫

    一、概述數組

        Spring 3.1 引入了基於註解(annotation)的緩存(cache)技術緩存

    二、須要的jar包jvm

        

    三、使用方法socket

    存分佈式

    @Cacheable(value=」緩存容器」,key=「鍵值」)學習

    注意事項:
        ①key值中是SPLE表達式,例如「#id」(不能直接寫字符串,須要SPLE表達式),參數組合是用「#id.concat("#name")」,使用concat有前提,就是拼接的兩個參數都必須是字符串,不然會報表達式錯誤,若是兩個非字符串須要拼接,參照#id「+「_」+「#name」

        ②須要用哪一個容器,就寫哪一個容器的value值

    更新

    ①清空對應

        @Cacheable(value="***", key="#id")

    ②清空全部

         @Cacheable(value="***", allEntries=true)

    按照條件操做緩存

        @Cacheable(value="***",condition="#userName.length() <= 4")

    既要保證方法被調用,又但願結果被緩存

        @CachePut(value="accountCache",key="#account.getName()")// 更新 accountCache 緩存

    XML配置
 

xmlns:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache" 

  http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd

<cache:annotation-driven />
    <!-- generic cache manager -->
  <bean id="cacheManager"
          class="org.springframework.cache.support.SimpleCacheManager">
      <property name="caches">
            <set>
                <bean
             class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                        p:name="default" />

                <bean
                        class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                        p:name="accountCache" />
            </set>
        </property>
    </bean>

參考文檔:https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/

2、EHcache

    一、簡介

  1. 快速
  2. 簡單
  3. 多種緩存策略
  4. 緩存數據有兩級:內存和磁盤,所以無需擔憂容量問題
  5. 緩存數據會在虛擬機重啓的過程當中寫入磁盤
  6. 能夠經過RMI、可插入API等方式進行分佈式緩存
  7. 具備緩存和緩存管理器的偵聽接口
  8. 支持多緩存管理器實例,以及一個實例的多個緩存區域
  9. 提供Hibernate的緩存實現

    二、缺點

        對分佈式支持不夠好,通常與Redis一塊使用

    三、ehcache 和 redis 比較

    ehcache直接在jvm虛擬機中緩存,速度快,效率高;可是緩存共享麻煩,集羣分佈式應用不方便

    redis是經過socket訪問到緩存服務,效率比ecache低,比數據庫要快不少, 
處理集羣和分佈式緩存方便,有成熟的方案。若是是單個應用或者對緩存訪問要求很高的應用,用ehcache。若是是大型系統,存在緩存共享、分佈式部署、緩存內容很大的,建議用redis。
    ehcache也有緩存共享方案,不過是經過RMI或者Jgroup多播方式進行廣播緩存通知更新,緩存共享複雜,維護不方便;簡單的共享能夠,可是涉及到緩存恢復,大數據緩存,則不合適。

    四、使用方法

        ①導包

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.10.2</version>
</dependency>

        ②新建xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
 
  <!-- 磁盤緩存位置 -->
  <diskStore path="java.io.tmpdir/ehcache"/>
 
  <!-- 默認緩存 -->
  <defaultCache
          maxEntriesLocalHeap="10000"
          eternal="false"
          timeToIdleSeconds="120"
          timeToLiveSeconds="120"
          maxEntriesLocalDisk="10000000"
          diskExpiryThreadIntervalSeconds="120"
          memoryStoreEvictionPolicy="LRU">
    <persistence strategy="localTempSwap"/>
  </defaultCache>
 
  <!-- helloworld緩存 -->
  <cache name="HelloWorldCache"
         maxElementsInMemory="1000"
         eternal="false"
         timeToIdleSeconds="5"
         timeToLiveSeconds="5"
         overflowToDisk="false"
         memoryStoreEvictionPolicy="LRU"/>
</ehcache>
maxElementsInMemory :內存中容許存儲的最大的元素個數,0表明無限個
clearOnFlush:內存數量最大時是否清除。
eternal :設置緩存中對象是否爲永久的,若是是,超時設置將被忽略,對象從不過時。
   根據存儲數據的不一樣,例如一些靜態不變的數據如省市區等能夠設置爲永不過期
timeToIdleSeconds : 設置對象在失效前的容許閒置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,
   可選屬性,默認值是0,也就是可閒置時間無窮大。
timeToLiveSeconds :緩存數據的生存時間(TTL),也就是一個元素從構建到消亡的最大時間間隔值,這隻能在元素不是永久駐留時有效,
   若是該值是0就意味着元素能夠停頓無窮長的時間。
overflowToDisk :內存不足時,是否啓用磁盤緩存。默認false
maxEntriesLocalDisk:當內存中對象數量達到maxElementsInMemory時,Ehcache將會對象寫到磁盤中。
maxElementsOnDisk:硬盤最大緩存個數。
diskSpoolBufferSizeMB:這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。
   每一個Cache都應該有本身的一個緩衝區。
diskPersistent:是否在VM重啓時存儲硬盤的緩存數據。默認值是false。
diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。
maxEntriesLocalHeap:是用來限制當前緩存在堆內存上所能保存的最大元素數量的
memoryStoreEvictionPolicy: 若是內存中數據超過內存限制,向磁盤緩存時的策略。默認值LRU,可選FIFO、LFU。

        四、整合spring

        

<!-- 啓用緩存註解開關 -->
	<cache:annotation-driven cache-manager="cacheManager"/>

	<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation" value="ehcache文件位置"/>
		<property name="shared" value="true"></property>
	</bean>

	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
		<property name="cacheManager" ref="cacheManagerFactory"/>
	</bean>

3、命中率

CacheManager manager = CacheManager.create();
String[] cacheNames = manager.getCacheNames();
net.sf.ehcache.Cache cache = manager.getCache(cacheName);
long statisticsCache = cache.getStatistics().cacheHitCount();
long putCount = cache.getStatistics().cachePutAddedCount();
相關文章
相關標籤/搜索