Ehcache Demo

转自:

https://my.oschina.net/zb0423/blog/60957
http://www.cnblogs.com/fsjin/articles/3521261.html

Ehcache 是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大。

  • 下载jar包 ehcache-core-2.3.0.jar
  • maven 仓库代理  https://repository.jboss.org/nexus/content/groups/developer/
  • 新搭建一个Maven项目
  • 配置jar包到pom文件中
  • 编写ehcache.xml缓冲配置文件 可以放在src的任何目录下

pom文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.lzyan.ehcache.demo</groupId>
  <artifactId>EhcacheDemo</artifactId>
  <version>v0.1</version>
  <name>EhcacheDemo</name>
  
  <dependencies>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.6</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.6</version>
        </dependency>
    </dependencies>
    
</project>
View Code

ehcache.xml文件:

<ehcache updateCheck="false" dynamicConfig="false">
    
    
    <!-- Sets the path to the directory where cache .data files are created.

         If the path is a Java System Property it is replaced by
         its value in the running VM.

         The following properties are translated:
         user.home - User's home directory
         user.dir - User's current working directory
         java.io.tmpdir - Default temp file path -->
    <diskStore path="D:/tmp/test/ehcache"/>
    
    <cacheManagerEventListenerFactory class="" properties=""/>

    <!--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
        maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="1200000"
        timeToLiveSeconds="1200000"
        overflowToDisk="true"
        />

    <cache name="icache-global"
        maxElementsInMemory="1000"
        eternal="true"
        timeToIdleSeconds="1800"
        timeToLiveSeconds="1800"
        overflowToDisk="true"
        />
    
    <cache name="SimplePageCachingFilter"
           maxElementsInMemory="10000"
           maxElementsOnDisk="1000"
           eternal="false"
           overflowToDisk="true"
           timeToIdleSeconds="300"
           timeToLiveSeconds="600"
           memoryStoreEvictionPolicy="LFU"
            />
</ehcache>
View Code

编写测试类:

import java.net.URL;
import java.util.concurrent.TimeUnit;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class EhCache_v2 {
    
    public static void main(String[] args) throws Exception {
        System.out.println("main(): begin ...");
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        URL url = loader.getResource("ehcache.xml");
        //创建一个缓存管理器
        CacheManager manager = CacheManager.create(url);
        String names[] = manager.getCacheNames();
        System.out.println("Available caches list: 
---------");
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }
        System.out.println("---------");
        
        if(names.length > 0){
            System.out.println("Selected_CacheName=" + names[0]);
        }
        Cache cache = manager.getCache(names[0]);
        cache.put(new Element("name", "admin"));
        
        Element element = cache.get("name");
        System.out.println("getValue()=" + element.getValue());        
        Object obj = element.getObjectValue();
        System.out.println("getObjectValue()=" + obj);
        
        TimeUnit.SECONDS.sleep(3);
        
        ThreadAction action = new ThreadAction();
        action.setCacheName(cache.getName());
        action.setManager(manager);
        action.start();

        System.out.println("=== main thread is return! ===");
    }
    
}

class ThreadAction extends Thread{
    private String cacheName;
    private CacheManager manager ;
    
    
    @Override
    public void run() {
        try {
            Thread.sleep(3000);
            Cache cache = manager.getCache(cacheName);
            Element element = cache.get("name");
            System.out.println("run(): 从缓存中取得数据:" + element.getObjectValue());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
    }
    
    public CacheManager getManager() {
        return manager;
    }
    public void setManager(CacheManager manager) {
        this.manager = manager;
    }

    public String getCacheName() {
        return cacheName;
    }
    public void setCacheName(String cacheName) {
        this.cacheName = cacheName;
    }

}
View Code

测试出缓存起作用:
需要设置配置文件中缓存名 name="SimplePageCachingFilter"  的存活时间

eternal="false"
timeToIdleSeconds="1"
timeToLiveSeconds="1"


不知道什么缓存管理器读取配置文件的规则,取出的 name[0]  是文件最后一个配置的缓存
然后再试运行 发现抛出空指针异常,说明从缓存中取不到数据了,说明这个测试可以测试出缓存是否起作用。

Demo2:

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class EhCache {
    
    public static void main(String[] args) {
        System.out.println("main(): begin ...");
        // CacheManager manager = new CacheManager();
        //创建一个缓存管理器
        CacheManager singletonManager = CacheManager.create();
        //建立一个缓存实例
        Cache memoryOnlyCache = new Cache("testCache", 5000, false, false, 5, 2);
        //在内存管理器中添加缓存实例
        singletonManager.addCache(memoryOnlyCache);
        Cache cache = singletonManager.getCache("testCache");
        //使用缓存
        Element element = new Element("key1", "value1");
        cache.put(element);
        cache.put(new Element("key1", "value2"));

        element = cache.get("key1");
        Object value = element.getObjectValue();
        System.out.println(value);

        int elementsInMemory = cache.getSize();
        System.out.println(elementsInMemory);

        long elementsInMemory2 = cache.getMemoryStoreSize();
        System.out.println(elementsInMemory2);

        Object obj = element.getObjectValue();
        cache.remove("key1");
        System.out.println(obj);
        singletonManager.shutdown();
        // manager.shutdown();
        System.out.println("main(): over ...");
    }
    
}
View Code
原文地址:https://www.cnblogs.com/ylz8401/p/6095071.html