• springboot 整合ehcache缓存


     1、CacheManager

    Spring Boot默认集成CacheManager,如下包所示:

      可以看出springboot自动配置了 JcacheCacheConfiguration、 EhCacheCacheConfiguration、HazelcastCacheConfiguration、GuavaCacheConfiguration、RedisCacheConfiguration、SimpleCacheConfiguration 等。

      默认的CacheManager为ConcurrenMapCacheManager,Spring从Spring3.1开始基于java.util.concurrent.ConcurrentHashMap实现的缓存管理器。Spring Boot 默认使用 ConcurrentMapCacheManager作为缓存技术。新建一个springboot项目,直接使用cache相关注解来测试,效果如下:

    2、整合encache

      pom依赖引入

        <!--开启 cache 缓存 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <!-- ehcache 缓存 -->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>

      application文件配置

    spring:
          cache:
            #ehcache配置文件路径
            ehcache:
              config: classpath:/ehcache/ehcache.xml
            #指定缓存类型,可加可不加
            #type: ehcache

      encache.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache name="myEncache">
    
        <!--
            diskStore:为缓存路径,ehcache分为内存和磁盘 2级,此属性定义磁盘的缓存位置
            user.home - 用户主目录
            user.dir - 用户当前工作目录
            java.io.tmpdir - 默认临时文件路径
        -->
        <diskStore path="D:/home/Tmp_Ehcache"/>
        <!--
            name:缓存名称。
            maxElementsInMemory:缓存最大数目
            maxElementsOnDisk:硬盘最大缓存个数。
            eternal:对象是否永久有效,一但设置了,timeout将不起作用。
            overflowToDisk:是否保存到磁盘,当系统宕机时
            timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
            timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
            diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
            diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
            diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
            memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
            clearOnFlush:内存数量最大时是否清除。
            memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
                FIFO,first in first out,这个是大家最熟的,先进先出。
                LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
                LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
    -->
        <defaultCache
                eternal="false"
                maxElementsInMemory="1000"
                overflowToDisk="false"
                diskPersistent="false"
                timeToIdleSeconds="0"
                timeToLiveSeconds="600"
                memoryStoreEvictionPolicy="LRU"
        />
        <cache
                name="users_test"
                eternal="false"
                maxElementsInMemory="100"
                overflowToDisk="false"
                diskPersistent="false"
                timeToIdleSeconds="0"
                timeToLiveSeconds="300"
                memoryStoreEvictionPolicy="LRU"
        />
    
    </ehcache>

      启动类加上启用缓存注解

    @EnableCaching
    public class SpringbootCacheApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootCacheApplication.class, args);
        }
    
    }

      代码中使用cache注解

    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserMapper userMapper;
    
        //使用ehcache配置的缓存名users_test
        private final String USER_CACHE_NAME = "users_test";
    
        @Override
        public List<User> listUser() {
            return userMapper.selectUserList();
        }
    
        @Override
    //    @Cacheable(value = USER_CACHE_NAME, key = "#id")
        @Cacheable(value = USER_CACHE_NAME, key = "'user' + #id")
        public User selectUserById(Integer id) {
            return userMapper.selectUserById(id);
        }
    
        @Override
    //    @CacheEvict(value = USER_CACHE_NAME, key = "#id")
        @CacheEvict(value = USER_CACHE_NAME, key = "'user_' + #id")
        public void delete(Integer id) {
            userMapper.delete(id);
        }
    
        @Override
    //    @CacheEvict(value = USER_CACHE_NAME, key = "#user.userId")
        @CacheEvict(value = USER_CACHE_NAME, key = "'user' + #user.userId")
    //    @CachePut(value = USER_CACHE_NAME, key = "'user' + #user.userId") //测试发现只将结果清除,key未清除,导致查询继续使用缓存但结果为空????
        public void update(User user) {
            userMapper.update(user);
        }
    }

      项目启动后查看CacheManager,如下图所示则表示整合ehcache成功 

     参考源码:Github

  • 相关阅读:
    图的概念、存储、遍历、最短路径问题、最小生成树、拓扑排序、关键路径
    Nginx负载均衡
    Nginx反向代理
    Nginx配置虚拟主机
    Linux下Nginx安装
    freemarker使用
    ActiveMQ与spring整合
    ActiveMQ安装
    全局异常处理
    solr整合spring
  • 原文地址:https://www.cnblogs.com/kingsonfu/p/10412295.html
Copyright © 2020-2023  润新知