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