ehcache-3.x

Ehcache简介
  Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

  Ehcache最初是由Greg Luck于2003年开始开发。2009年,该项目被Terracotta购买。软件仍然是开源,但一些新的主要功能(例如,快速可重启性之间的一致性的)只能在商业产品中使用,例如Enterprise EHCache and BigMemory。维基媒体Foundationannounced目前使用的就是Ehcache技术。

Ehcache特点

快速
简单
多种缓存策略
缓存数据有两级:内存和磁盘,因此无需担心容量问题
缓存数据会在虚拟机重启的过程中写入磁盘
可以通过RMI、可插入API等方式进行分布式缓存
具有缓存和缓存管理器的侦听接口
支持多缓存管理器实例,以及一个实例的多个缓存区域
提供Hibernate的缓存实现

Ehcache简单例子:

pom.xml

    <!--Ehcache 3,注意2.的版本和3.版本的区别挺大的-->
    <dependency>
      <groupId>org.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>3.4.0</version>
    </dependency>
    <dependency>
      <groupId>javax.cache</groupId>
      <artifactId>cache-api</artifactId>
      <version>1.0.0</version>
    </dependency>

不使用配置文件

import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
​
/**
 * Created by Blossom on 2018/9/25.
 */
public class NoXml {
​
    public static void main(String[] args){
        //静态的org.ehcache.config.builders.CacheManagerBuilder.newCacheManagerBuilder方法,
        // 返回一个org.ehcache.config.builders.CacheManagerBuilder实例
        CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                .withCache("preConfigured",
                        //使用构建起定义一个名为preConfigured的Cache
                        // 该cache在执行cacheManager.build()之后被实际的CacheManager实例所创建
                        // 第一个String作为cache的别名。
                        // 第二个参数org.ehcache.config.CacheConfiguration,被用来配置Cache
                        // 我们在org.ehcache.config.builders.CacheConfigurationBuilder中
                        // 使用静态的newCacheConfigurationBuilder()方法创建一个默认的配置文件
                        CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
                                ResourcePoolsBuilder.heap(100))
                                //最后调用build()返回一个完整的实例,但是该实例并未初始化,CacheManager我们就能够使用了。
                                .build())
                //在使用CacheManager之前,我们先对其进行初始化。该初始化操作有一两种方式。
                // 在CacheManager中采用CacheManager.init()进行初始化
                // 或者是调用CacheManagerBuilder.build(boolean init)完成初始化操作,该参数是布尔型,设置为true。
                .build(true);
​
        Cache<Long, String> preConfigured
                //通过别名,键类型,值类型我们可以在cacheManager中检索出一个Cache
                // 举例来说,要获得第2步中声明的缓存,您需要它的别名=“preConfigured”,
                // keyType=Long.class和valueType = String.class。
                // 处于类型安全考虑,我们要求键和值类型都要传递。如果这些和我们期望的不同
                // CacheManager将会抛出一个ClassCastException在应用程序生命周期的早期
                // 这可以保护缓存免受随机类型的污染。
                = cacheManager.getCache("preConfigured", Long.class, String.class);
        //CacheManager能够被用于创建需要的Cache实例,就像第2步一样,它需要像CacheConfiguration一样通过别名检索
        // 这个实例和完全初始化的缓存将通过CacheManager.getCache()接口返回和/或访问。
        Cache<Long, String> myCache = cacheManager.createCache("myCache",
                CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
                        ResourcePoolsBuilder.heap(100)).build());
        //新添加的Cache能够通过键值对的形式被用于存储条目。put方法的第一个参数是键,第二个参数是值。
        // 记住,键和值类型必须是与在cacheconfig容器中定义的类型相同的类型。
        // 另外,键必须是惟一的,并且只与一个值相关联。
        myCache.put(1L, "da one!");
        //通过调用cache.get(key)方法,从缓存中检索值。它只需要一个参数,这个参数是键,然后返回与该键关联的值。
        // 如果没有与该键相关联的值,则返回null。Cache将释放所有本地持有的临时资源(例如内存)。
        // 对这个缓存的引用变得不可用。
        String value = myCache.get(1L);
        System.out.println(value);
        //我们可以通过CacheManager.removeCache(String)移除一个给定的Cache,
        // CacheManager不仅会删除它对Cache的引用,而且还会关闭它。
        cacheManager.removeCache("preConfigured");
        //为了释放一个CacheManager提供的所有临时资源(内存、线程、…),您必须调用CacheManager.close(),
        // 它将关闭所有在当时已知的缓存实例。
        cacheManager.close();
    }
​
}

使用配置文件:

<config
        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
        xmlns='http://www.ehcache.org/v3'
        xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd">
    <!-- 1、声明一个名为foo的Cache-->
    <cache alias="foo">
        <!--2、foo的键值对被声明为字符串类型,如果没有指明,默认是Object类型。-->
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <resources>
            <!--3、foo被声明在堆上保存多达2,000个条目。-->
            <heap unit="entries">2000</heap>
            <!--4、在它开始被驱逐之前,还有多达500 MB的外堆内存-->
            <offheap unit="MB">500</offheap>
        </resources>
    </cache>
    <!--5、<cache-template>可以让你创建一个抽象的<cache>配置文件,该配置文件可以进一步的被扩展。-->
    <cache-template name="myDefaults">
        <key-type>java.lang.Long</key-type>
        <value-type>java.lang.String</value-type>
        <heap unit="entries">200</heap>
    </cache-template>
    <!--6、bar是这样的cache,它使用名为myDefaults的<cache-template>,并将其主键覆盖到更广泛的类型-->
    <cache alias="bar" uses-template="myDefaults">
        <key-type>java.lang.Number</key-type>
    </cache>
    <!--7、simpleCache是另一个cache,它使用myDefaults配置文件作为其唯一的CacheConfiguration-->
    <cache alias="simpleCache" uses-template="myDefaults" />
​
</config>

import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.Configuration;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.xml.XmlConfiguration;
import org.junit.Test;
import java.net.URL;
​
/**
 * Created by Blossom on 2018/9/25.
 */
public class First {
​
    @Test
    public void testDefault() throws Exception{
        URL url = getClass().getResource("/ehcache.xml");
        //实例化一个XmlConfiguration,将XML文件URL传递给它
        Configuration xmlConfig = new XmlConfiguration(url);
        //使用静态的org.ehcache.config.builders.CacheManagerBuilder.newCacheManager(org.ehcache.config.Configuration)
        //使用XmlConfiguration的Configuration创建你的CacheManager实例。
        CacheManager myCacheManager = CacheManagerBuilder.newCacheManager(xmlConfig);
        myCacheManager.init();
        Cache<String, String> foo = myCacheManager.getCache("foo",String.class,String.class);
        Cache<Number, String> bar = myCacheManager.getCache("bar",Number.class,String.class);
        Cache<Long, String> simpleCache = myCacheManager.getCache("simpleCache",Long.class,String.class);
        foo.put("1","zhangsan");
        foo.put("2","lisi");
​
        bar.put(1.1,"zhangsan");
        bar.put(2.2,"lisi");
​
        simpleCache.put(1L,"zhangsan");
        simpleCache.put(2L,"lisi");
​
        System.out.println(foo.get("1"));
        System.out.println(simpleCache.get(2L));
​
        myCacheManager.close();
    }
​
}

猜你喜欢

转载自blog.csdn.net/blossomfzq/article/details/82868451