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方法便读不到数据了。


相关文章
|
3月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
2月前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
38 1
|
3月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
消息中间件 缓存 监控
116 0
|
3月前
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
953 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
3月前
|
缓存 NoSQL Java
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
|
3月前
|
缓存 Java Spring
Java本地高性能缓存实践问题之在Spring Boot中启用缓存支持的问题如何解决
Java本地高性能缓存实践问题之在Spring Boot中启用缓存支持的问题如何解决
|
3月前
|
存储 缓存 NoSQL
基于SpringBoot+Redis解决缓存与数据库一致性、缓存穿透、缓存雪崩、缓存击穿问题
这篇文章讨论了在使用SpringBoot和Redis时如何解决缓存与数据库一致性问题、缓存穿透、缓存雪崩和缓存击穿问题,并提供了相应的解决策略和示例代码。
79 0
|
5月前
|
缓存 Java 数据库
springboot数据库及缓存常用依赖及配置
springboot数据库及缓存常用依赖及配置