ehcache简介

EHCache是sourceforge的开源缓存项目,现已经具有独立官网,网址:(http://www.ehcache.org)。其本身是纯JAVA实现的,所以可以和绝大多数Java项目无缝整合,例如:Hibernate的缓存就是基于EHCache实现的。

EHCache支持内存和磁盘缓存,默认是存储在内存中的,当内存不够时允许把缓存数据同步到磁盘中,所以不需要担心内存不够问题。

EHCache支持基于Filter的Cache实现,同时也支持Gzip压缩算法提高响应速度。

为什么使用这个ehcache技术

现在的问题,我们在页面只用shiro标签实现是否有权限,或者注解判断是否有权限,每一个标签,或者每一个注解,都会走realm里面的授权的方法,里面会从数据库查询权限之后,放到权限对象里面。每一个标签或者注解都会走这个方法,都会进行查询数据库一次,我们的项目里面是使用了很多的权限标签和注解的,每一个都走数据库,那么是不好的。

所以我们希望就查询数据库一次,把查询出来的数据放到缓冲里面,以后每一个权限标签 或者 注解都走缓冲就可以了。

代码实现

添加依赖

2.1添加依赖
从3.0版本开始groupid为org.ehcache
<!--配置SpringBoot整合EHCache的依赖-->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-ehcache</artifactId>s
    <version>1.4.2</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

写ehcache的配置文件

 

<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="ehcache" updateCheck="false">

    <!-- 磁盘缓存位置 -->
    <diskStore path="java.io.tmpdir"/>
    <!-- 默认缓存 -->
    <defaultCache
            maxEntriesLocalHeap="1000"
            eternal="false"
            timeToIdleSeconds="3600"
            timeToLiveSeconds="3600"
            overflowToDisk="false">
    </defaultCache>

    <!-- 登录记录缓存 锁定10分钟 -->
    <cache name="loginRecordCache"
           maxEntriesLocalHeap="2000"
           eternal="false"
           timeToIdleSeconds="600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

</ehcache>

有了这个配置文件,需要我们的项目识别,也就是这个配置的对象需要shiro框架识别,那么就需要在shiro配置文件里面配置,要放到securitymanager对象里面。

 

//创建Bean方法,ehCacheManager
@Bean
public EhCacheManager ehCacheManager(){

 
    //创建ehCacheManager对象
    EhCacheManager ehCacheManager=new EhCacheManager();
    //获取配置文件的流对象
    InputStream is=null;
    try{

 
         is = ResourceUtils.getInputStreamForPath("classpath:ehcache/ehcache-shiro.xml");

    }catch (Exception e){

 
        e.printStackTrace();
    }
    //获取CarManager对象
    net.sf.ehcache.CacheManager cacheManager = new net.sf.ehcache.CacheManager(is);
    ehCacheManager.setCacheManager(cacheManager);
    //返回
    return  ehCacheManager;

}

 

以上配置好之后,realm里面的授权代码,就会只是执行一次啦