一、ehcache简介
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。具体的关于ehcache的介绍及配置教程可以网上查找,这里不再赘述。
二、引入ehcache依赖
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.8.2</version> </dependency>三、ehcache配置
1、ehcache.xml配置
<ehcache> <diskStore path="java.io.tmpdir"/> <!--Default Cache configuration. These will applied to caches programmatically created through the CacheManager. The following attributes are required for defaultCache: maxInMemory - Sets the maximum number of objects that will be created in memory eternal - Sets whether elements are eternal. If eternal, timeouts are ignored and the element is never expired. timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used if the element is not eternal. Idle time is now - last accessed time timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used if the element is not eternal. TTL is now - creation time overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache has reached the maxInMemory limit. --> <defaultCache maxEntriesLocalHeap="100000" eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" /> <cache name="cacheTest" eternal="false" maxEntriesLocalHeap="100000" timeToIdleSeconds="0" timeToLiveSeconds="3600" overflowToDisk="false" statistics="true"> </cache> </ehcache>
2、在application.xml中配置
<!--缓存配置--> <cache:annotation-driven cache-manager="cacheManager" /> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcache"></property> </bean> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"></property> </bean>
四、在Service中使用注解添加依赖。
@Service public class UserService { @Autowired private UserMapper userMapper; @Cacheable(value = "cacheTest",key = "#id") public User getUserById(Long id) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return userMapper.selectByPrimaryKey(id); } }五、测试
可以看到第一次访问时,缓存中没有,执行Service方法,从数据库中查找,响应同时缓存到缓存,第二次执行时,直接从缓存中查找。
参考: