本文大綱 html
1、簡介 算法
在項目中,用到Shiro來作驗證受權的控制。但在實際使用的時候,發現用戶每訪問一個功能,都會從新到UserRealm中獲取一次權限。這樣子會花費大量的系統系統。此時就想到了使用緩存,查了一下,Shiro也確實支持Authorization和Authentication作緩存,那就果斷使用。 spring
但說到緩存,到底是怎麼一回事呢?這裏我將從零開始向你們介紹一下緩存。因爲網上已經有不少具體實現的文章了,本文內容是對緩存知識的逐步進階整理,目的是讓你們能從零開始對緩存進行了解,直到懂得如何實現Spring+Shiro+Ehcache的緩存配置。文章中不會重複網上能找到的一大堆內容,並會給出相關的參考文章給你們參考。 數據庫
2、緩存的概念 apache
一、緩存簡介 緩存
緩存,簡單來講,就是讓數據更接近於使用者。工做機制是:先從緩存中讀取數據,若是沒有再從慢速設備上(如數據庫)讀取實際數據(數據也會存入緩存)。 安全
2、緩存策略 服務器
緩存中數據都有必定的生命週期,何時移除、何時到期,都有必定的講究。主要分下面三點。 session
2.1 移除策略框架
移除策略,即若是緩存滿了,從緩存中移除數據的策略;常見的有LFU、LRU、FIFO:
FIFO(First In First Out):先進先出算法,即先放入緩存的先被移除;
LRU(Least Recently Used):最久未使用算法,使用時間距離如今最久的那個被移除;
LFU(Least Frequently Used):最近最少使用算法,必定時間段內使用次數(頻率)最少的那個被移除;
2.2 TTL(Time To Live )
存活期,即從緩存中建立時間點開始直到它到期的一個時間段(無論在這個時間段內有沒有訪問都將過時)
2.3 TTI(Time To Idle)
空閒期,即一個數據多久沒被訪問將從緩存中移除的時間。
3、參考資料
可參看此文的緩存簡介:http://jinnianshilongnian.iteye.com/blog/2001040
3、自定義實現緩存機制
1 實現步驟
實現簡單的緩存機制,一般只需實現下面四點:
只要選擇好cache,和建立好CacheManager,就能夠在Service中,經過建立CacheManager來管理緩存了。
2 存在問題
但咱們本身作出來的緩存因爲比較簡單考慮得沒那麼全面,因此問題也很多,如:
等等。
3 參考資料
因爲網上已有不少實現的文章,這裏不作重複。例如可參考:
http://blog.csdn.net/fanzhanwei/article/details/44958297
4、什麼是Ehcache
上一節是自定義緩存的實現,能夠看出,本身能夠作一個簡單的緩存,可是不夠完善。其實已經有不少第三方的緩存框架,有完善的機制,能夠給咱們使用,而ehcache就是這樣一種緩存框架。
1 Ehcache簡介
EhCache是一個純Java的進程內緩存框架,具備快速、精幹等特色,也是Hibernate中默認的CacheProvider。它會把查出來的數據存儲在內存或者磁盤中,以節省查詢數據庫的壓力。
2 Ehcache使用條件
由於若是更新很頻繁的數據,那就沒有緩存的必要了,可能還會增長開銷呢。
據說Ehcache的同步不是很完善,會形成不一樣服務器上的Ehcache緩存同步未必及時,這樣可能會形成用戶在獲取數據的時候不一致。
3 Ehcache使用場景
5、Ehcache怎麼用
1 Ehcache使用步驟
使用Ehcache,基本步驟以下:
2 Ehcache配置文件
關於配置文件,默認狀況下會加載classpath下名爲ehcache.xml的配置文件。若是加載失敗,會加載Ehcache報中的ehcache-failsafe.xml文件,這個文件中含有簡單的默認配置。
在ehcache.xml配置文件中,須要瞭解各參數的意思,如下是一個範例:
3 參考資料
具體例子可參考此網站:http://www.cnblogs.com/jingmoxukong/p/5975994.html
6、Spring對緩存的支持
1 Spring配置
Spring自己有對緩存方案的簡單實現,可經過註釋驅動來實現緩存機制。緩存中,最重要的兩個概念就是CacheManager和Cache,Spring中的實現分別是:
另外加上緩存的註解驅動配置:<cache:annotation-driven />
因此關鍵的spring xml配置文件以下:
2 重要註釋
在Spring緩存中,關鍵是在方法中增長@Cacheable、@CachePut、@CacheEvict三個註釋,而後方法內注意實現業務邏輯就好,無需像《第二部分:自定義實現緩存機制》那樣子要參雜不少的緩存管理邏輯,這就是第三方緩存框架的一大好處。實際上Spring是經過Spring AOP,在方法的調用先後,分別攔截參數和返回值,來實現緩存的錄入的。關於上面上個註釋的做用以下:
具體例子可參考此網站:https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/
7、Spring+Ehcache實現
Spring cache能知足一些基本的緩存需求,但若是需求複雜了,用戶量上去了,或者性能要求高了,Spring cache就估計難以支持了。由於它不支持高可用性,也不具有持久化數據的能力,這個時候就須要用到第三方的緩存方案,但仍是用Spring的API,代碼無需改動。這就是最理想的狀態了,而Spring也支持這一點。
要配置實用Ehcache,主要改動Spring的xml配置文件,將cacheManager這個bean的具體實現由org.springframework.cache.support.SimpleCacheManager改成org.springframework.cache.ehcache.EhCacheCacheManager,並引用org.springframework.cache.ehcache.EhCacheManagerFactoryBean這個bean。此兩個類的做用:
org.springframework.cache.ehcache.EhCacheManagerFactoryBean:加載Ehcache配置文件。
org.springframework.cache.ehcache.EhCacheCacheManager:支持net.sf.ehcache.CacheManager。
配置文件以下:
具體例子可參考此網站:http://www.cnblogs.com/jingmoxukong/p/5975994.html
8、Spring+Shiro+Ehcache實現
1 配置cacheManager
若是要集成Shiro,這裏又得在Spring的xml配置文件中修改一下cacheManager的實現類,將其改成org.apache.shiro.cache.ehcache.EhCacheManager。以下:
<!-- 緩存管理器 使用Ehcache實現 --> <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/> </bean>
這樣就可使用適合shiro的Ehcache的CacheManager了。
2 配置Realm
修改Realm的bean,指定其cache相關屬性的值,以下:
<!-- Realm實現 --> <bean id="userRealm" class="com.huangzijian.realm.UserRealm"> <property name="cachingEnabled" value="true"/> <property name="authenticationCachingEnabled" value="true"/> <property name="authenticationCacheName" value="authenticationCache"/> <property name="authorizationCachingEnabled" value="true"/> <property name="authorizationCacheName" value="authorizationCache"/> </bean>
注意此處的cacheName,就是指在Ehcache中配置的cache,也就是一般在ehcache.xml中定義的cacahe。
3 配置securityManager
須要在securityManager中配置cacheManager屬性,引用配好的cacheManager,以下:
<!-- 安全管理器 --> <bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager"> <property name="realms"> <list>
<ref bean="userRealm"/>
</list> </property> <property name="sessionManager" ref="sessionManager"/> <property name="cacheManager" ref="cacheManager"/> </bean>
通過上面三步,便可激活Shiro的Authentication和Authorization的緩存機制,從而沒必要要每次都讀取數據庫來肯定該人員的角色之類的,極大的節省了資源。
9、總結
經過上述一步一步的進階,相信你們均可以實現本身想要的緩存了。本文是經過要實現shiro中的Authorization和Authentication緩存,來逐步讓你們接觸起緩存的使用。對於緩存的使用,還有不少更深刻的內容,這裏只作了拋磚引玉,有待你們之後的使用瞭解了。