一、简介
EHCache是一个快速的、轻量级的、易于使用的、进程内的缓存。它支持read-only 和 read/write 缓存,内存和磁盘缓存。
二、使用
pom.xml文件:
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.5.2</version>
</dependency>
application.properties文件:
# ehcache配置文件地址
spring.cache.ehcache.config=classpath:ehcache.xml
spring.cache.type=ehcache
XXXApplication.java
@SpringBootApplication
@EnableCaching//开启缓存
@PropertySource("application.properties")
public class XXXApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(XXXApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(XXXApplication.class, args);
}
}
ehcache.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false"
name="myEhcache">
<diskStore path="java.io.tmpdir/Tmp_EhCache"/>
<defaultCache eternal="false"
maxElementsInMemory="1000"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="0"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LRU"/>
<cache name="user"
eternal="false"
maxElementsInMemory="10000"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
memoryStoreEvictionPolicy="LFU"/>
<!--
缓存配置
name: 缓存名称。
maxElementsInMemory: 缓存最大个数。
eternal: 对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds: 设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds: 设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk: 当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB: 这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk: 硬盘最大缓存个数。
diskPersistent: 是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy: 当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush: 内存数量最大时是否清除。
-->
</ehcache>
操作DAO的Java文件
@Service("UserService")
//对应ehcache.xml文件里面的<cache name="user">
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
//无论怎样,都将方法的返回结果放到缓存当中。
//ehcache3 会自动处理要缓存的key-value里面的key
@CachePut
public void save(User user) {
System.out.println("新增功能,更新缓存,直接写库, id=" + user);
userRepository.save(user);
}
@Override
@CachePut
public void update(User user) {
System.out.println("更新功能,更新缓存,直接写库, id=" + user);
userRepository.save(user);
}
@Override
//将一条或者多条数据从缓存中删除。
@CacheEvict
public void remove(Long userId) throws Exception {
System.out.println("删除功能,删除缓存,直接写库, id=" + userId);
userRepository.deleteById(userId);
}
@Override
@CacheEvict
public void batchRemove(Long[] userIds) throws Exception {
for (Long userId : userIds) {
userRepository.deleteById(userId);
}
}
@Override
public List<User> getUserList() {
return userRepository.findAll();
}
@Override
public User findByUsername(String username) {
return userRepository.findByUsername(username);
}
@Override
//在方法执行前Spring先是否有缓存数据,如果有直接返回。如果没有数据,调用方法并将方法返回值存放在缓存当中。
@Cacheable
public User findById(long id) {
System.out.println("查询功能,缓存找不到,直接读库, id=" + id);
return userRepository.findById(id);
}
}