007-spring cache-缓存实现-02-springboot ehcahe2、ehcache3实现、springboot caffeine实现
一、springboot ehcahe3实现步骤
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。
Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。
1.1、主要特性:
快速、简单、多种缓存策略
缓存数据有两级:内存和磁盘,因此无需担心容量问题
缓存数据会在虚拟机重启的过程中写入磁盘
可以通过RMI、可插入API等方式进行分布式缓存
具有缓存和缓存管理器的侦听接口
支持多缓存管理器实例,以及一个实例的多个缓存区域
提供Hibernate的缓存实现
注意:ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用
1.2、和Redis比较:
ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。
如果是单个应用或者对缓存访问要求很高的应用,用ehcache。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。
ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。
ehcache3.x与2.x的差距还是非常大的,主要区别在于3.x后使用了java的缓存规范JSR107
1.3、基础配置
参看:002-spring cache 基于声明式注解的缓存-01-Cacheable annotation
参看上述两个配置
代码地址:https://github.com/bjlhx15/common.git spring-cache/springboot2-cache-ehcache2
代码地址:https://github.com/bjlhx15/common.git spring-cache/springboot2-cache-ehcache3
二、springboot caffeine实现步骤
Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代Guava。如果出现Caffeine,CaffeineCacheManager将会自动配置。使用spring.cache.cache-names属性可以在启动时创建缓存,并可以通过以下配置进行自定义(按顺序):
- spring.cache.caffeine.spec: 定义的特殊缓存
- com.github.benmanes.caffeine.cache.CaffeineSpec: bean定义
- com.github.benmanes.caffeine.cache.Caffeine: bean定义
代码地址:https://github.com/bjlhx15/common/tree/master/spring-cache/spring-cache-caffeine
1、pom
2、启动类注解
3、业务类注解
4、配置
spring:
cache:
cache-names: user
caffeine:
spec: initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s
其中spec配置参数
initialCapacity=[integer]: 初始的缓存空间大小
maximumSize=[long]: 缓存的最大条数
maximumWeight=[long]: 缓存的最大权重
expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
weakKeys: 打开key的弱引用
weakValues:打开value的弱引用
softValues:打开value的软引用
recordStats:开发统计功能
注意:如果使用了refreshAfterWrite配置还必须指定一个CacheLoader,如:
package com.lhx.spring.cache.caffeine; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.github.benmanes.caffeine.cache.CacheLoader; @Configuration public class CacheLoaderSelf { /** * 必须要指定这个Bean,refreshAfterWrite=5s这个配置属性才生效 * */ @Bean public CacheLoader<Object, Object> cacheLoader() { CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() { @Override public Object load(Object key) throws Exception { return null; } // 重写这个方法将oldValue值返回回去,进而刷新缓存 @Override public Object reload(Object key, Object oldValue) throws Exception { return oldValue; } }; return cacheLoader; } }
注意:
- expireAfterWrite和expireAfterAccess同事存在时,以expireAfterWrite为准。
- maximumSize和maximumWeight不可以同时使用
- weakValues和softValues不可以同时使用