ehcache
一、没有spring时的缓存
导入jar包
ehcache-core-2.5.2.jar
slf4j-api-1.7.25.jar
在src下创建ehcache配置文件ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="500" eternal="false"
timeToIdleSeconds="300" timeToLiveSeconds="1200" overflowToDisk="true" />
<cache name="ehcacheGO" maxElementsInMemory="150" eternal="false"
timeToLiveSeconds="36000" timeToIdleSeconds="3600" overflowToDisk="true" />
</ehcache>
使用工具类对缓存进行增删改查
import java.net.URL;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
public class EhcacheUtil {
private static final String path = "/ehcache.xml";
private URL url;
private CacheManager manager;
private static EhcacheUtil ehCache;
private EhcacheUtil(String path) {
url = getClass().getResource(path);
manager = CacheManager.create(url);
}
public static EhcacheUtil getInstance() {
if (ehCache == null) {
ehCache = new EhcacheUtil(path);
}
return ehCache;
}
public void put(String cacheName, String key, Object value) {
Cache cache = manager.getCache(cacheName);
Element element = new Element(key, value);
cache.put(element);
}
public Object get(String cacheName, String key) {
Cache cache = manager.getCache(cacheName);
Element element = cache.get(key);
return element == null ? null : element.getObjectValue();
}
public Cache get(String cacheName) {
return manager.getCache(cacheName);
}
public void remove(String cacheName, String key) {
Cache cache = manager.getCache(cacheName);
cache.remove(key);
}
}
存储
EhcacheUtil.getInstance().put("ehcacheGO", "userEch", parameter);
获取
Object o=EhcacheUtil.getInstance().get("ehcacheGO", "userEch");
配置讲解
配置自定义缓存
maxElementsInMemory:缓存中允许创建的最大对象数
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,
两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,
如果该值是 0 就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,
这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
overflowToDisk:内存不足时,是否启用磁盘缓存。
memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。<br>
二、与spring mvc整合
会用到的jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.9</version>
</dependency>
</dependencies>
在spring的配置文件中加入缓存命名空间和ehCacheManager
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描bean-->
<context:component-scan base-package="com.hw">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
<!--配置 spring 缓存管理器-->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
p:cacheManager-ref="ehcache"/>
<!--配置 ehcache 缓存管理器-->
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:ehcache.xml"/>
</beans>
创建ehcache.xml放入到classpath的根目录下
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--磁盘储存配置-->
<diskStore path="java.io.tmpdir/ehcache"/>
<!--默认缓存配置-->
<defaultCache>
<persistence strategy="localTempSwap"/>
</defaultCache>
<!--配置 users 缓存-->
<cache name="users"
maxElementsInMemory="2000"
maxElementsOnDisk="100000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="1200"
memoryStoreEvictionPolicy="LRU"
overflowToDisk="true"/>
</ehcache>
配置自定义缓存
开辟了一个缓存空间,该缓存空间的名字为"menuitem"
maxElementsInMemory:缓存中允许创建的最大对象数
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,
两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,
如果该值是 0 就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,
这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
overflowToDisk:内存不足时,是否启用磁盘缓存。
memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
spring mvc配置文件中加入启用缓存注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<context:component-scan base-package="com.hw">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<font color="#f9963b"> <cache:annotation-driven/></font>
</beans>
在Service中加入注解
@Service
public class UserService {
//获取元素
@Cacheable(value = "users", key="#userId")
public User getUser( int userId) {
System.out.println("添加缓存");
//模拟从数据库中获取 User 对象
User user = new User();
user.setId(userId);
user.setName("assad");
user.setPassword("233333");
user.setIcon("icon-001");
return user;
}
//将 userId 对应的 User 从缓存中删除
@CacheEvict(value = "users", key="#userId")
public void removeUserFromCache( int userId){
System.out.println("清除缓存");
}
}
说明: 在执行 getUser 方法的时候,会把方法的返回值放入到了一个为" users" 的缓存区域中,再次调用 getUser 方法时, getUser 方法体里面的内容将不再执行除非缓存消失
@CacheEvict(value = “users”, key="#userId")该注解应该添加在增加或者修改的方法上 添加到增加或者修改的方法上以后,只要执行方法,则会清空缓存
注意:需要在mvc文件中开启缓存驱动
<cache:annotation-driven/>