項目中須要加緩存,故學習了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
一、簡介
二、缺點
對分佈式支持不夠好,通常與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();