zoukankan      html  css  js  c++  java
  • SpringBoot集成EhCache

    Maven依赖:

    <!-- EhCache -->
    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
          <groupId>net.sf.ehcache</groupId>
          <artifactId>ehcache</artifactId>
          <version>2.10.4</version>
    </dependency>
    

    配置ehcache.xml(resources→config→ehcache.xml):

    <?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">
    
    
        <!--指定一个文件目录,当EhCache把数据写到硬盘上时,将把数据写到这个文件目录下
             user.home :         用户主目录
             user.dir :          用户当前工作目录
             java.io.tmpdir :    默认临时文件路径(C:UsersAdministratorAppDataLocalTempTmp_EhCache)
         -->
        <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
    
        <!--
        name:                            缓存名称
        eternal:                         true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false
        timeToIdleSeconds:               设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态
        timeToLiveSeconds:               设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义
        maxElementsInMemory:             内存中最大缓存对象数;maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行
        memoryStoreEvictionPolicy:       当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)
        maxElementsOnDisk:               硬盘中最大缓存对象数,若是0表示无穷大
        overflowToDisk:                  是否保存到磁盘,当系统宕机时
        diskPersistent:                  是否缓存虚拟机重启期数据,是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法
        diskSpoolBufferSizeMB:           这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
        diskExpiryThreadIntervalSeconds: 磁盘失效线程运行时间间隔,默认为120秒
        clearOnFlush:                    内存数量最大时是否清除
        -->
        <!--defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则默认缓存策略-->
    
        <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="true"
                      diskPersistent="true"
                      timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
    
        <cache
                name="user"
                eternal="false"
                maxElementsInMemory="200"
                overflowToDisk="false"
                diskPersistent="true"
                timeToIdleSeconds="0"
                timeToLiveSeconds="300"
                memoryStoreEvictionPolicy="LRU"/>
    
    </ehcache>
    

    EhCache配置:

    package com.example.demo.Config;
    
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.cache.ehcache.EhCacheCacheManager;
    import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.ClassPathResource;
    
    @Configuration
    @EnableCaching
    public class EhcacheConfig {
        @Bean
        public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean) {
            return new EhCacheCacheManager(bean.getObject());
        }
    
        /**
         * 据shared与否的设置,
         * Spring分别通过CacheManager.create()
         * 或new CacheManager()方式来创建一个ehcache基地.
         * 也说是说通过这个来设置cache的基地是这里的Spring独用,还是跟别的(如hibernate的Ehcache共享)
         *
         * @return
         */
        @Bean
        public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
            EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
            cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("config/ehcache.xml"));
            cacheManagerFactoryBean.setShared(true);
            return cacheManagerFactoryBean;
        }
    }
    

    Service层方法加上注解:添加-删除-更新(@Cacheable()、@CacheEvict()、@CachePut()):

    package com.example.demo.Service.Impl;
    
    import com.example.demo.Entity.Cache;
    import com.example.demo.Repository.CacheRepository;
    import com.example.demo.Service.CacheService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class CacheServiceImpl implements CacheService {
        @Autowired
        private CacheRepository cacheRepository;
    
        @Override
        @Cacheable(value = "user")
        public List<Cache> list() {
            System.out.println("MySQL查询啦!!!!。。。。");
            return cacheRepository.findAll();
        }
    
        @Override
        @CacheEvict(value = "user")
        public void deleteCacheUser() {
        }
    }
    

    测试:

    http://localhost:8032/api/user

    http://localhost:8032/api/delete

    GitHub源码:https://github.com/zeng-xian-guo/springboot_jwt_token.git

  • 相关阅读:
    JS移动端滑屏事件
    css3,background-clip/background-origin的使用场景,通俗讲解
    addEventListener和on的区别
    JavaScript 变量生命周期
    label标签跳出循环
    js替换指定字符串
    使用ECMAscript5中的forEach函数遍历数组
    截取js数组中某段值(slice)
    数组的一个强大函数splice,[增,删,改]
    删除数组值
  • 原文地址:https://www.cnblogs.com/zxg-6/p/13788178.html
Copyright © 2011-2022 走看看