pom.xmljava
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.4</version>
</dependency>web
spring-config.xmlspring
<!-- 緩存管理器 使用 Ehcache 實現 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
</bean>
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"/>
<!-- 緩存管理器 -->
<property name="cacheManager" ref="cacheManager" />
</bean> apache
<?xml version="1.0" encoding="UTF-8"?> <ehcache name="shirocache"> <diskStore path="java.io.tmpdir"/> <!-- 登陸記錄緩存 鎖定10分鐘 --> <cache name="passwordRetryCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="authorizationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="10" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="authenticationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="20" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache>
ehcache.xml 說明: http://my.oschina.net/004/blog/214851bootstrap
1.ehcache.xml配置文件詳解緩存
<ehcache>安全
<!--磁盤存儲配置:用來指定緩存在磁盤上的存儲位置。分佈式
能夠使用JavaVM環境變量(user.home, user.dir, java.io.tmpdir)-->ide
<diskStore path = "c:/cache/" />函數
<!--指定CacheManagerEventListenerFactory,這個對象在緩存添加的時候會獲得相應的通知。
CacheManagerEventListenerFactory的屬性:
*class :CacheManagerEventListenerFactory的一個實現類。
*properties :CacheManagerEventListenerFactory的屬性值,以逗號(,)分割多個屬性。
若是沒有實現類被指定,則系統不建立CacheManager的監聽器,沒有默認值-->
<cacheManagerEventListenerFactory class="" properties="" />
<!--在進行分佈式緩存的應用時須要指定CacheManagerPeerProviderFactory,用來生成CacheManagerPeerProvider的實例,以便和集羣中的其餘CacheManager通訊。
CacheManagerPeerProvider的屬性:
*class :CacheManagerPeerProviderFactory的一個實現類。
*properties :CacheManagerPeerProviderFactory的屬性值,以逗號(,)分割多個屬性。
Ehcache內建了2種基於RMI分佈系統的通訊策略:
*automatic :使用多播組。在一個節點加入或者推出集羣的時候自動感應。
*manual :硬編碼方式
-->
<cacheManagerPeerListenerFactory class="" properties="" />
<!--默認緩存配置,如下屬性是必須的:
name :cache的標識符,在一個CacheManager中必須惟一。
maxElementsInMemory : 在內存中緩存的element的最大數目。
maxElementsOnDisk : 在磁盤上緩存的element的最大數目。
eternal : 設定緩存的elements是否有有效期。若是爲true,timeouts屬性被忽略。
overflowToDisk : 設定當內存緩存溢出的時候是否將過時的element緩存到磁盤上。
如下屬性是可選的:
timeToIdleSeconds : 緩存element在過時前的空閒時間。
timeToLiveSeconds : 緩存element的有效生命期。
diskPersistent : 在VM重啓的時候是否持久化磁盤緩存,默認是false。
diskExpiryThreadIntervalSeconds : 磁盤緩存的清理線程運行間隔,默認是120秒.
memoryStoreEvictionPolicy : 當內存緩存達到最大,有新的element加入的時候,
移除緩存中element的策略。默認是LRU,可選的有LFU和FIFO
緩存子元素:
cacheEventListenerFactory:註冊相應的的緩存監聽類,用於處理緩存事件,如put,remove,update,和expire
bootstrapCacheLoaderFactory:指定相應的BootstrapCacheLoader,用於在初始化緩存,以及自動設置。
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="1000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
<!--cache配置同defaultCache -->
<cache name="test"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false"
/>
</ehcache>
2.ehcache 包可用方法介紹:
建立CacheManager 的方法:
方法一:
CacheManager manager = new CacheManager();
方法二:
CacheManager manager = new CacheManager("src/config/ehcache.xml");
方法三:
URL url = getClass().getResource("/anotherconfigurationname.xml");
CacheManager manager = new CacheManager(url);
方法四:
InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
try {
CacheManager manager = new CacheManager(fis);
} finally {
fis.close();
}
獲取cacheNames 列表:
方法一:
CacheManager.create();
String[] cacheNames = CacheManager.getInstance().getCacheNames();
方法二:
CacheManager manager = new CacheManager();
String[] cacheNames = manager.getCacheNames();
方法三:
CacheManager manager1 = new CacheManager("src/config/ehcache1.xml");
CacheManager manager2 = new CacheManager("src/config/ehcache2.xml");
String[] cacheNamesForManager1 = manager1.getCacheNames();
String[] cacheNamesForManager2 = manager2.getCacheNames();
添加和刪除緩存元素:
設置一個名爲testCache 的新cache,屬性爲默認:
CacheManager singletonManager = CacheManager.create();
singletonManager.addCache("testCache");
Cache test = singletonManager.getCache("testCache");
設置一個名爲testCache 的新cache,並定義其屬性:
CacheManager singletonManager = CacheManager.create();
Cache memoryOnlyCache = new Cache("testCache", 5000, false, false, 5, 2);
singletonManager.addCache(memoryOnlyCache);
Cache test = singletonManager.getCache("testCache");
Cache 屬性說明:
構造函數:
public Cache(String name,
int maxElementsInMemory,
boolean overflowToDisk,
boolean eternal,
long timeToLiveSeconds,
long timeToIdleSeconds)
參數說明:
name :元素名字。
maxElementsInMemory :設定內存中建立對象的最大值。
overflowToDisk : 設置當內存中緩存達到 maxInMemory 限制時元素是否可寫到磁盤上。
eternal : 設置元素是否永久駐留。
timeToIdleSeconds : 設置某個元素消亡前的停頓時間。也就是在一個元素消亡以前,兩次訪問時間的最大時間間隔值。只能在元素不是永久駐留時有效。
timeToLiveSeconds : 設置某個元素消亡前的生存時間。也就是一個元素從構建到消亡的最大時間間隔值。只能在元素不是永久駐留時有效。
刪除緩存元素:
CacheManager singletonManager = CacheManager.create();
singletonManager.removeCache("testCache");
關閉緩存管理器 CacheManager
CacheManager.getInstance().shutdown();
對於緩存對象的操做:
放入一個簡單的對象到緩存元素;
Cache cache = manager.getCache("testCache");
Element element = new Element("key1", "value1");
cache.put(element);
獲得一個序列化後的對象屬性值;
Cache cache = manager.getCache("testCache");
Element element = cache.get("key1");
Serializable value = element.getValue();
獲得一個沒有序列化後的對象屬性值;
Cache cache = manager.getCache("testCache");
Element element = cache.get("key1");
Object value = element.getObjectValue();
刪除一個對象從元素;
Cache cache = manager.getCache("testCache");
Element element = new Element("key1", "value1");
cache.remove("key1");
對於永固性磁盤存儲,當即存儲到磁盤:
Cache cache = manager.getCache("testCache");
cache.flush();
得到緩存大小:
獲得緩存的對象數量;
Cache cache = manager.getCache("testCache");
int elementsInMemory = cache.getSize();
獲得緩存對象佔用內存的數量
Cache cache = manager.getCache("testCache");
long elementsInMemory = cache.getMemoryStoreSize();
獲得緩存對對象佔用磁盤的數量
Cache cache = manager.getCache("testCache");
long elementsInMemory = cache.getDiskStoreSize();
關於緩存的讀取和丟失的記錄:
獲得緩存讀取的命中次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getHitCount();
獲得內存中緩存讀取的命中次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getMemoryStoreHitCount();
獲得磁盤中緩存讀取的命中次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getDiskStoreCount();
獲得緩存讀取的丟失次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getMissCountNotFound();
獲得緩存讀取的已經被銷燬的對象丟失次數;
Cache cache = manager.getCache("testCache");
int hits = cache.getMissCountExpired();
© 著做權歸做者全部