java1234 shiro 第0 .1課 緩存

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

 ehcache.xml

<?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();

© 著做權歸做者全部

相關文章
相關標籤/搜索