欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ehcache3.0尝鲜

程序员文章站 2022-05-17 08:05:10
...

项目中要用缓存,考虑用ehcache,到官网一看,画风都变了,Logo也换了颜色,原来被收购了

最新的版本为3.0,直接maven引入

<dependency>
      <groupId>org.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>3.0.0</version>
</dependency>

groupId已经变了,之前是net.sf.ehcache,整个包也发生了变化,API更是巨变,如果和spring3.x结合的话,就不能使用spring自带的那些FactoryBean了

配置文件也变了,一个简单的可用的配置文件如下:

<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/xml/ehcache-core-3.0.xsd">

<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>

<cache alias="bar" uses-template="myDefaults">
	<key-type>java.lang.Number</key-type>
</cache>

<cache alias="simpleCache" uses-template="myDefaults" /> 

<cache alias="myCache">
	<key-type>java.lang.Long</key-type>
	<value-type>java.lang.String</value-type>
	<expiry>
		<ttl unit="seconds">20</ttl>
	</expiry>
	<heap unit="entries">2</heap>
</cache>
	
</config>

简单的代码模板如下:

CacheManager cacheManager
    = CacheManagerBuilder.newCacheManagerBuilder() 
    .withCache("preConfigured",
        CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))) 
    .build(); 
cacheManager.init(); 

Cache<Long, String> preConfigured =
    cacheManager.getCache("preConfigured", Long.class, String.class); 

Cache<Long, String> myCache = cacheManager.createCache("myCache", 
    CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)).build());

myCache.put(1L, "da one!"); 
String value = myCache.get(1L); 

cacheManager.removeCache("preConfigured"); 

cacheManager.close();

我们可以限制缓存的大小或者是数目

比较重要的改进就是提供了Off-heap存储,它是相对于堆内存而言的

Off-Heap Store – Limited in size only by available RAM (tested to as much as 6TB on a single machine!). Not subject
to Java garbage collection (GC). Is quite fast, yet slower than the On-Heap Store because data must be moved off and
on the JVM’s heap as it is stored and re-accessed.
Off-heap只受限于机器的物理内存,并且不会受到GC的影响,它很快,比磁盘要快多了,但是要比堆内存慢一点,存储的对象需要被序列化和反序列化

通过下面的参数来设置Off-heap的最大大小

-XX:MaxDirectMemorySize
所以这时我们有了3种存储方案:On-heap,Off-heap,disk,我们可以同时使用这三种方案,ehcache会对我们的数据重排序,并且使用分层的方式来存储,即最热的数据(也就是经常被访问的数据)会被存储在最快的层,而慢一点的数据会被移动到慢一点的层

至于eviction策略,貌似不能像2那样指定FIFO,LRU,LFU这种,它会自己管理eviction,而这种evict是不确定的,所以你会发现回下代码每次的结果可能都不同

Cache ce = myCacheManager.getCache("cache", Long.class, String.class);
ce.put(1L, "a");
ce.put(2L, "b");
ce.put(3L, "c");
System.out.println(ce.get(1L)); // a
System.out.println(ce.get(2L));// b
System.out.println(ce.get(3L));// c
配置的是永不过期,容量为2,你会发现a,b,c三处每一处都有可能取得null,所以这就需要我们在取得null时要进一步的处理

ehchache还提供了对javax.cache,也就是JSR-107的实现

好了,说了这么多废话,结论就是:不好用,还是用2好了,使用2的最新的版本

<dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>2.10.1</version>
      <type>pom</type>
</dependency>

和spring结合,需要

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>${spring.version}</version>
</dependency>

添加ehcache.xml

applicationContext.xml中添加

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
	 
<bean id="MyCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
	<property name="cacheManager" ref="cacheManager" />
	<property name="cacheName" value="MyCache" />
</bean>

转载于:https://my.oschina.net/dxqr/blog/662345