配置
ehcache.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <?xml version="1.0" encoding="UTF-8"?> <ehcache>
<diskStore path="D:\ehcache" />
<defaultCache maxElementsInMemory="100" eternal="true" overflowToDisk="true"/> <cache name="a" maxElementsInMemory="100" eternal="true" overflowToDisk="true"/> </ehcache>
cache元素的属性:
name:缓存名称
maxElementsInMemory:内存中最大缓存对象数
maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大
eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false
overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。
diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。
diskPersistent:是否缓存虚拟机重启期数据
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒
timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态
timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
|
简单使用
maven引入
1 2 3 4 5
| <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.3</version> </dependency>
|
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public static void main(String[] args) { CacheManager manager=CacheManager.create("./src/main/resources/ehcache.xml"); Cache c=manager.getCache("a"); Element e=new Element("test","测试"); c.put(e); Element e2=c.get("test"); System.out.println(e2); System.out.println(e2.getObjectValue()); c.flush(); manager.shutdown(); }
|
SpringBoot中使用
一、使用注解的方式(更简洁,代码量少)
1、引入pom依赖,springboot缓存支持和ehcache
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
|
2、启动类添加@EnableCaching注解以及application.properties配置文件增加配置
1 2 3 4
| spring.cache.type=ehcache
spring.cache.ehcache.config=classpath:/ehcache.xml
|
3、添加ehcache.xml文件在resources文件夹下
文件内容参照上方
**4、使用注解实现缓存功能:@Cacheable(添加操作),@CachePut(修改操作),@CacheEvict(删除操作) **
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import tk.coffeey.dao.UserDao; import tk.coffeey.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class UserServiceImpl implements UserService { private UserDao userDao; @Autowired public UserserviceImpl(UserDao userDao) { this.userDao = userDao; } @Override @Cacheable(value="users",key = "#id") public User get(Long id) { User user=userDao.getUser(1L); System.out.println("1111111111111111111111111"); return user; } @Override @CachePut(value = "users") public User save(Long id) { User user=new User(); System.out.println("222222"); return user; } @Override @CacheEvict(value="users",key = "#id") public void delete(Long id) { System.out.println("33333333333"); }
}
|
二、普通方式(更灵活)
1、引入pom依赖,ehcache
1 2 3 4 5
| <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
|
2、启动类添加@EnableCaching注解,application.properties配置文件增加配置(同上)
3、添加ehcache.xml文件在resources文件夹下(同上)
4、service方法使用如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| import tk.coffeey.dao.UserDao; import tk.coffeey.entity.User; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class UserServiceImpl2 implements UserService { private UserDao userDao; private CacheManager cacheManager; @Autowired public UserServiceImpl2(UserDao userDao, CacheManager cacheManager) { this.userDao = userDao; this.cacheManager = cacheManager; } @Override public User get(Long id) { Cache cache = cacheManager.getCache("users"); Element element = cache.get(id); if(element!=null){ return (User)element.getObjectValue(); }else{ User user=userDao.getUser(1L); Element element2 = new Element(id, user); cache.put(element2); return user; } } @Override public User save(Long id) { User user=new User(); Cache cache = cacheManager.getCache("users"); Element element2 = new Element(id, user); cache.put(element2); return user; } @Override public void delete(Long id) { Cache cache = cacheManager.getCache("users"); cache.remove(id); } }
|
需要注意,EhCache设置了元素过期时间,当元素过期时,EhCache并不会主动去清除缓存(内存)中的元素,当查询(get)时,EHCache才会把它从缓存中清空,如果一直未查询,则会一直存在于缓存中,可能会导致内存泄漏风险。
查阅文档博客时,有查看提及到当元素超过maxElementsInMemory(内存中最大缓存对象数)时,会清除掉过期元素,暂且有待验证。