一.Ehcache
关于 Ehcache的详细用法,可以参考: EhCache
是进程内的缓存框架.
二. SpringBoot 整合 Ehcache 缓存
按照上一章节 Spring Cache 整合Redis 的用法, 整合 Ehcache.
按照 SpringBoot_Cache 项目 创建 SpringBoot_Ehcache 项目.
去掉关于 Redis的的相关信息,包括 依赖, config 配置和 RedisUtil 工具类。
二.一 添加 ehcache依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!--添加 ehcache依赖--> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
注意,要去掉 spring-boot-starter-data-redis 依赖信息.
二.二 配置 ehcache.xml 文件
在 resource 目录下, 创建 ehcache.xml 缓存配置文件
<ehcache> <diskStore path="java.io.tmpdir/spring_ehcache"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" /> <cache name="user_" maxElementsInMemory="10000" eternal="true" overflowToDisk="true" diskPersistent="true" diskExpiryThreadIntervalSeconds="600"/> </ehcache>
●name: 缓存的名称,可以通过指定名称获取指定的某个Cache对象
●maxElementsInMemory :内存中允许存储的最大的元素个数,0代表无限个
●clearOnFlush:内存数量最大时是否清除。
●eternal :设置缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。根据存储数据的不同,例如一些静态不变的数据如省市区等可以设置为永不过时
●timeToIdleSeconds : 设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
●timeToLiveSeconds :缓存数据的 生存时间(TTL),也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。(和上面的两者取最小值)
●overflowToDisk:内存不足时,是否启用磁盘缓存。
●maxEntriesLocalDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
●maxElementsOnDisk:硬盘最大缓存个数。
●diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
●diskPersistent:是否在VM重启时存储硬盘的缓存数据。默认值是false。
●diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
●memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。这里比较遗憾,Ehcache并没有提供一个用户定制策略的接口,仅仅支持三种指定策略,感觉做的不够理想
二.三 application.yml 指定 ehcache缓存配置文件位置
server: port: 8081 servlet: context-path: /Ehcache # 引入 数据库的相关配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true username: root password: abc123 # 去掉了以前大量的Redis配置 # 配置ehcache的使用 cache: ehcache: config: classpath:ehcache.xml # 配置ehcache文件的路径 #整合mybatis时使用的 mybatis: #包别名 type-aliases-package: top.yueshushu.learn.pojo #映射文件路径 mapper-locations: classpath:mybatis/mapper/**/*.xml configuration: #日志信息 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
二.四 启动类添加 @EnableCaching 缓存
@MapperScan("top.yueshushu.learn.mapper") @SpringBootApplication //开启缓存 @EnableCaching public class RedisApplication { public static void main(String[] args) { SpringApplication.run(RedisApplication.class,args); System.out.println("运行 Redis Cache的Ehcache缓存"); } }
二.五 Spring Cache 注解与 Ehcache的使用
可以参考上一章节 Spring Cache 中注解的相关的用法信息.
这儿老蝴蝶不做太过的讲述.
二.五.一 @CacheConfig 类统一配置
@CacheConfig(cacheNames ={"user_"}) public class UserServiceImpl implements UserService { }
二.五.二 @Cacheable 查询
@Override @Cacheable(key="#id" ) public User findById(int id) { return userMapper.findById(id); } @Override @Cacheable(key = "#root.targetClass+#root.methodName") public List<User> findAll() { return userMapper.findAll(); } @Cacheable(key = "#root.targetClass+#root.methodName") @Override public List<User> findByNameAndSex(String name, String sex) { return userMapper.findByNameAndSex(name,sex); }
二.五.三 @CachePut 修改
@CachePut(key = "#result.id") @Override public User addUser(User user) { userMapper.addUser(user); return user; } @Override @CachePut(key = "#user.id") public User updateUser(User user) { userMapper.updateUser(user); //更新全部的缓存信息 return user; }
二.五.四 @CacheEvict 清空缓存
@Override @CacheEvict(key = "#id") public void deleteUser(int id) { userMapper.deleteById(id); }
二.五.五 @Caching 多缓存配置
@Caching( cacheable = { @Cacheable(key = "#name"), // 放置缓存到 name @Cacheable(key="#sex") // 放置缓存到 sex , id的缓存用 put更新 }, put = { @CachePut(key="#id") //同时更新 id缓存 } ) @Override public List<User> findByNameAndSexAndId(String name, String sex, Integer id) { return userMapper.findByNameAndSexAndId(name,sex,id); }
相应的测试,也是正常的。 Ehcache是放置在内存里面的,所以无法查询相应的内存信息.