ehcache

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/>
上一篇:逆软件工程(源代码)


下一篇:四十五 常用内建模块 hashlib