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
上一篇: Android基于google Zxing实现二维码的生成
下一篇: PHP Overview
推荐阅读