springboot使用EhCache缓存

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

发布了66 篇原创文章 · 获赞 35 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41890624/article/details/100536440