标签:取数据 session 创建 instance cto map 简单实现 等等 string
本文大纲
一、简介
在项目中,用到Shiro来做验证授权的控制。但在实际使用的时候,发现用户每访问一个功能,都会重新到UserRealm中获取一次权限。这样子会花费大量的系统系统。此时就想到了使用缓存,查了一下,Shiro也确实支持Authorization和Authentication做缓存,那就果断使用。
但说到缓存,究竟是怎么一回事呢?这里我将从零开始向大家介绍一下缓存。由于网上已经有很多具体实现的文章了,本文内容是对缓存知识的逐步进阶整理,目的是让大家能从零开始对缓存进行了解,直到懂得如何实现Spring+Shiro+Ehcache的缓存配置。文章中不会重复网上能找到的一大堆内容,并会给出相关的参考文章给大家参考。
二、缓存的概念
1、缓存简介
缓存,简单来说,就是让数据更接近于使用者。工作机制是:先从缓存中读取数据,如果没有再从慢速设备上(如数据库)读取实际数据(数据也会存入缓存)。
2、缓存策略
缓存中数据都有一定的生命周期,什么时候移除、什么时候到期,都有一定的讲究。主要分下面三点。
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
三、自定义实现缓存机制
1 实现步骤
实现简单的缓存机制,通常只需实现下面四点:
只要选择好cache,和创建好CacheManager,就可以在Service中,通过创建CacheManager来管理缓存了。
2 存在问题
但我们自己做出来的缓存由于比较简单考虑得没那么全面,所以问题也不少,如:
等等。
3 参考资料
由于网上已有很多实现的文章,这里不做重复。例如可参考:
http://blog.csdn.net/fanzhanwei/article/details/44958297
四、什么是Ehcache
上一节是自定义缓存的实现,可以看出,自己可以做一个简单的缓存,但是不够完善。其实已经有很多第三方的缓存框架,有完善的机制,可以给我们使用,而ehcache就是这样一种缓存框架。
1 Ehcache简介
EhCache是一个纯Java的进程内缓存框架,具有快速、精干等特点,也是Hibernate中默认的CacheProvider。它会把查出来的数据存储在内存或者磁盘中,以节省查询数据库的压力。
2 Ehcache使用条件
因为如果更新很频繁的数据,那就没有缓存的必要了,可能还会增加开销呢。
听说Ehcache的同步不是很完善,会造成不同服务器上的Ehcache缓存同步未必及时,这样可能会造成用户在获取数据的时候不一致。
3 Ehcache使用场景
五、Ehcache怎么用
1 Ehcache使用步骤
使用Ehcache,基本步骤如下:
2 Ehcache配置文件
关于配置文件,默认情况下会加载classpath下名为ehcache.xml的配置文件。如果加载失败,会加载Ehcache报中的ehcache-failsafe.xml文件,这个文件中含有简单的默认配置。
在ehcache.xml配置文件中,需要了解各参数的意思,以下是一个范例:
3 参考资料
具体例子可参考此网站:http://www.cnblogs.com/jingmoxukong/p/5975994.html
六、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/
七、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
八、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的缓存机制,从而不必要每次都读取数据库来确定该人员的角色之类的,极大的节省了资源。
九、总结
通过上述一步一步的进阶,相信大家都可以实现自己想要的缓存了。本文是通过要实现shiro中的Authorization和Authentication缓存,来逐步让大家接触起缓存的使用。对于缓存的使用,还有很多更深入的内容,这里只做了抛砖引玉,有待大家以后的使用了解了。
从零到实现Shiro中Authorization和Authentication的缓存
标签:取数据 session 创建 instance cto map 简单实现 等等 string
原文地址:http://www.cnblogs.com/huangzijian/p/6723630.html