zoukankan      html  css  js  c++  java
  • 【springboot】springboot整合ehcache实现缓存机制

      EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

      ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题。

      spring-boot是一个快速的集成框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

      由于spring-boot无需任何样板化的配置文件,所以spring-boot集成一些其他框架时会有略微的不同。

      1.spring-boot是一个通过maven管理的jar包的框架,集成ehcache需要的依赖如下

     <dependency>
        <groupId>org.springframework</groupId>
         <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
             <groupId>net.sf.ehcache</groupId>
          <artifactId>ehcache</artifactId>
              <version>2.8.3</version>
    </dependency>        

        具体pom.xml文件如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.lclc.boot</groupId>
        <artifactId>boot-cache</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <!-- Inherit defaults from Spring Boot -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.1.3.RELEASE</version>
        </parent>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>17.0</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>
            <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache</artifactId>
                <version>2.8.3</version>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <url>http://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>spring-milestones</id>
                <url>http://repo.spring.io/milestone</url>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-snapshots</id>
                <url>http://repo.spring.io/snapshot</url>
            </pluginRepository>
            <pluginRepository>
                <id>spring-milestones</id>
                <url>http://repo.spring.io/milestone</url>
            </pluginRepository>
        </pluginRepositories>
    
    </project>

       2.使用ehcache,我们需要一个ehcache.xml来定义一些cache的属性。

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
      updateCheck="false">
              <diskStore path="java.io.tmpdir/Tmp_EhCache" />
               <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
        timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" />
    
                <cache name="demo" eternal="false" maxElementsInMemory="100" overflowToDisk="false" diskPersistent="false"
        timeToIdleSeconds="0" timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU" />
    
    </ehcache>

       解释下这个xml文件中的标签。

      (1).diskStore: 为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:    
                 user.home – 用户主目录
                 user.dir  – 用户当前工作目录
                 java.io.tmpdir – 默认临时文件路径

      (2).defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。

           (3).cache:自定缓存策略,为自定义的缓存策略。参数解释如下:

        cache元素的属性:   
                name:缓存名称                 
                maxElementsInMemory:内存中最大缓存对象数                 
                maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大                 
                eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false               
                overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。                 
                diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。              
                diskPersistent:是否缓存虚拟机重启期数据                 
                diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒    
                timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态                 
                timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义    
                memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。  

      3.将ehcache的管理器暴露给spring的上下文容器,

      

    @Configuration
    // 标注启动了缓存
    @EnableCaching
    public class CacheConfiguration {
    
        /*
         * ehcache 主要的管理器
         */
        @Bean(name = "appEhCacheCacheManager")
        public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){
            return new EhCacheCacheManager (bean.getObject ());
        }
    
        /*
         * 据shared与否的设置,Spring分别通过CacheManager.create()或new CacheManager()方式来创建一个ehcache基地.
         */
        @Bean
        public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){
            EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean ();
            cacheManagerFactoryBean.setConfigLocation (new ClassPathResource ("conf/ehcache-app.xml"));
            cacheManagerFactoryBean.setShared (true);
            return cacheManagerFactoryBean;
        }
    }

           @Configuration:为spring-boot注解,主要标注此为配置类,优先扫描。

          @Bean:向spring容器中加入bean。

      至此所有的配置都做好了,通过spring-boot进行集成框架就是这么简单。

      4.使用ehcache

        使用ehcache主要通过spring的缓存机制,上面我们将spring的缓存机制使用了ehcache进行实现,所以使用方面就完全使用spring缓存机制就行了。
        具体牵扯到几个注解:

        @Cacheable:负责将方法的返回值加入到缓存中,参数3
        @CacheEvict:负责清除缓存,参数4

         参数解释:

        value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name
        key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL
        condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

        allEntries:CacheEvict参数,true表示清除value中的全部缓存,默认为false

      不多说,直接上代码:

      

    @Service
    public class CacheDemoServiceImpl implements CacheDemoService {
    
        /**
         * 缓存的key
         */
        public static final String THING_ALL_KEY   = "\"thing_all\"";
        /**
         * value属性表示使用哪个缓存策略,缓存策略在ehcache.xml
         */
        public static final String DEMO_CACHE_NAME = "demo";
       
        @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
        @Override
        public void create(Thing thing){
            Long id = getNextId ();
            thing.setId (id);
            data.put (id, thing);
        } 
          
         @Cacheable(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'")
        @Override
        public Thing findById(Long id){
            System.err.println ("没有走缓存!" + id);
            return data.get (id);
        }
    
          @Cacheable(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
        @Override
        public List<Thing> findAll(){
            return Lists.newArrayList (data.values ());
        }
       
       
          @Override
        @CachePut(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'")
        @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
        public Thing update(Thing thing){
            System.out.println (thing);
            data.put (thing.getId (), thing);
            return thing;
        }
    
        @CacheEvict(value = DEMO_CACHE_NAME)
        @Override
        public void delete(Long id){
            data.remove (id);
        }
       
    }

        5.只需要通过注解在service层方法上打注解便可以使用缓存,在find**上存入缓存,在delete**,update**上清除缓存。

          

      

  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/lic309/p/4072848.html
Copyright © 2011-2022 走看看