EhCache 是一个纯Java的进程内缓存框架,具有快速熟悉、上手简单等特点,是Hibernate框架默认的缓存提供方。
hibernate提供了两级缓存,分别为一级session级缓存策略,二级是SessionFactory对象缓存。在此基础上可以配置三层查询缓存也就是整合此次介绍的Ehcache。
一级缓存:基于session级别的分配的一块内存空间,一般情况下session对象的生命周期对应的是一数据库事物或应用事物,因此它的缓存是事务范围的缓存,是一个必须的缓存。
二级缓存:SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。二级缓存默认是关闭的,如果要使用需要手动开启,并且依赖EhCache组件。
三级缓存:查询缓存,配置开启该缓存的情况下,重复使用一个sql查询某个范围内的数据,会进行缓存。
Ehcache:直接在Jvm虚拟机中缓存,速度快,效率高,不适合处理大规模缓存数据,在分布式环境下,缓存数据共享操作复杂;
Redis:作为独立的缓存中间件,在分布式缓存系统中非常好用,缓存数据共享,有效支撑大量数据缓存,支持哨兵模式,或者集群模式的高可用成熟方案;
org.springframework.boot
spring-boot-starter-cache
net.sf.ehcache
ehcache
spring:
cache:
ehcache:
config: classpath:ehcache.xml
配置参数说明
maxElementsOnDisk:磁盘缓存中最多可以存放的元素数量;
eternal:缓存中对象是否永久有效;
timeToIdleSeconds:当eternal=false时使用,缓存数据有效期(单位:秒),时间段内没有访问该元素,将被清除;
timeToLiveSeconds:缓存数据的存活时间;
maxElementsInMemory:内存中最多可以存放的元素数量,overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中,若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素;
diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔;
memoryStoreEvictionPolicy:缓存释放策略,LRU会优先清理最少使用的缓存;
localTempSwap:持久化策略,当堆内存或者非堆内存里面的元素已经满了的时候,将其中的元素临时的存放在磁盘上,重启后就会消失;
@EnableCaching
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class,args) ;
}
}
@Service
public class CacheService {
private static final Logger LOGGER = LoggerFactory.getLogger(CacheService.class);
@Resource
private UserMapper userMapper ;
@Cacheable(value="UserInfo") // 在缓存有效期内,首次查询才访问数据库
public UserEntity getById (String id){
// 通过日志,标识方法是否执行
LOGGER.info("getById..."+id);
return userMapper.selectById(id) ;
}
@CacheEvict(value="UserInfo",key = "#id") //该ID数据更新,清空该ID缓存
public void updateUser(String id) {
UserInfo user = new UserInfo () ;
user.setId(id);
user.setUserName("myCache");
userMapper.updateById(user);
}
}
注解参数说明
@Cacheable:注解标记在一个方法上,也可以标记在一个类上,标记在一个方法上表示该方法支持缓存,该方法被调用后将其返回值缓存起来,下次同样的请求参数执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。
@CacheEvict:注解标记在需要清除缓存元素的方法或类上的,当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作,并且可以按照指定属性清除。