springboot使用EhCache缓存

简介: pom.xml中添加依赖

pom.xml中添加依赖


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
我这里只用了一个依赖,我看网上其他例子都是还有另一个
<dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
</dependency>


但是我加了这个依赖启动会报错 所以就注释掉了。


然后在resource下面创建EhCache.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<defaultCache maxElementsInMemory="10000" eternal="false"
  timeToIdleSeconds="120" timeToLiveSeconds="120"
  maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120"
  memoryStoreEvictionPolicy="LRU">
  <persistence strategy="localTempSwap" />
</defaultCache>
<cache name="userCache" eternal="false" timeToIdleSeconds="2400"
  timeToLiveSeconds="2400" maxEntriesLocalHeap="10000"
  maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120"
  overflowToDisk="false" memoryStoreEvictionPolicy="LRU">
</cache>

name:缓存名称。

maxElementsInMemory:缓存最大个数。

eternal:对象是否永久有效,一但设置了,timeout将不起作用。

timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。

timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。

overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。 diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。

maxElementsOnDisk:硬盘最大缓存个数。

diskPersistent:是否缓存虚拟机重启期数据 Whether the diskstore persists between restarts of the Virtual Machine. The default value is false.

diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。

memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。  


Ehcache 的三种清空策略


1 FIFO,first in first out,这个是大家最熟的,先进先出。


2 LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来


最少被使用的。如上面所讲,缓存的元素有一个 hit 属性,hit 值最小的将会被清出缓存。


3 LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量


满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时


间最远的元素将被清出缓存。



clearOnFlush:内存数量最大时是否清除。



在service层中使用

@Service
@CacheConfig(cacheNames = { "userCache" })
public class User1Service {
  private static final String CACHE_KEY = "'person'";// 这里一定要加单引号,否则会被当做一个正常的字符串来识别
  private static final String CACHE_NAME = "userCache";// 对应ehcache.xml中cache的name
  @Autowired
  private User1Mapper mapper1;
  @Autowired
  private CacheManager manager;
  @Cacheable(value = CACHE_NAME, key = "'person_'+#id")
  public UserDemo findOne(Integer id) {
    System.out.println(id);
    return mapper1.findOne(id);
  }
  @CachePut(value = CACHE_NAME, key = CACHE_KEY)
  public UserDemo saveOne(UserDemo user) {
    return mapper1.save(user);
  }
  @CacheEvict(value=CACHE_NAME,key="'person_'+#id")
        public void deleteOne(String username) {
            mapper1.delete(username);
        }
  public void clear() {
    manager.getCache("userCache").clear();
  }
}

@CacheConfig: 指定缓存配置的名称,这里可以配置多个,多个用逗号分开

private static final String CACHE_KEY = "'person'";这个地方要特别注意,一定要写单引号,否则表达式会把它当做一个正常的字符串来解析的

@Cacheable:类或者方法上,类代表所有的方法都使用它,方法上针对特定的方法,作用就是先查询缓存是否有值,有的话就直接返回缓存结果

@CachePut:标注在方法上, Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中

@CacheEvict:标注在方法或类上,做值的清除

上面三个注解有几个公有的参数:


value():值必须填写,是指定属于ehcache.xml中cache的name,可以是多个

key:自定义策略和默认策略

自定义策略:使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”


condition:指定缓存的条件


这里的clear方法是清空缓存。getCache方法的参数就是xml配置中cache的name。


调用findOne方法传一个id,获取到一条数据,然后在数据库中把该条数据删除 ,再调用方法依然可以获取到,便是从内存中读取的。如果在获取过一次数据后调用clear方法,清空缓存数据,再调用findOne方法便读不到数据了。


相关文章
|
19天前
|
缓存 NoSQL Java
SpringBoot实现缓存预热的几种常用方案
SpringBoot实现缓存预热的几种常用方案
|
19天前
|
缓存 NoSQL Java
Springboot 多级缓存设计与实现
Springboot 多级缓存设计与实现
|
7月前
|
缓存 NoSQL Java
分布式系列教程(03) -分布式Redis缓存(SpringBoot整合Redis)
分布式系列教程(03) -分布式Redis缓存(SpringBoot整合Redis)
109 0
|
7月前
|
缓存 NoSQL Java
分布式系列教程(01) -Ehcache缓存架构
分布式系列教程(01) -Ehcache缓存架构
120 0
|
7月前
|
缓存 Java Maven
微服务技术系列教程(07) - SpringBoot - 缓存的使用
微服务技术系列教程(07) - SpringBoot - 缓存的使用
50 0
|
19天前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
57 1
|
19天前
|
缓存 NoSQL Java
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存
68 0
|
8月前
|
缓存 数据可视化 NoSQL
【异常】springboot集成@Cacheable缓存乱码的问题解决方案
【异常】springboot集成@Cacheable缓存乱码的问题解决方案
175 1
|
19天前
|
缓存 NoSQL Java
面试官:SpringBoot如何实现缓存预热?
面试官:SpringBoot如何实现缓存预热?
91 0
|
19天前
|
缓存 NoSQL Java
springboot集成图片验证+redis缓存一步到位2
springboot集成图片验证+redis缓存一步到位2