一 Ehcache 简介
Ehcache是一个纯Java的进程内缓存框架。
对于缓存数据:
1.最原始的就是通过static静态变量将数据直接缓存在内容中
2.将部分数据缓存在内容中,部分缓存在磁盘上。因为可能内存容量不够。
Ehcache就可以将数据保存在内存和磁盘上。当然Ehcache保存数据的时候还可以配置各种策略。
但是Ehcache最实际的作用就是缓存数据在内存及磁盘上。
二 Ehcache 简单Demo
CacheControllor.java
package com;
import java.io.InputStream;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
public class CacheControllor {
private static InputStream is=Main.class.getClassLoader().getResourceAsStream("com/ehcache.xml");
private static CacheManager manager=new CacheManager(is);
public static Cache addCache(String cacheName) {
manager.addCache(cacheName);
return manager.getCache(cacheName);
}
public static Cache getCache(String cacheName){
return manager.getCache(cacheName);
}
public static void removeCache(String cacheName){
manager.removeCache(cacheName);
}
}
DefaultCacheManagerEventListener.java
package com;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.Status;
import net.sf.ehcache.event.CacheManagerEventListener;
public class DefaultCacheManagerEventListener implements CacheManagerEventListener{
@Override
public void dispose() throws CacheException {
System.out.println("==================== dispose ====================");
}
@Override
public Status getStatus() {
return Status.STATUS_ALIVE;
}
@Override
public void init() throws CacheException {
System.out.println("==================== init CacheManagerEventListenerfactory ====================");
}
@Override
public void notifyCacheAdded(String str) {
System.out.println("==================== notify cache added "+str+" ==================== ");
}
@Override
public void notifyCacheRemoved(String str) {
System.out.println("==================== notify cache removed "+str+" ==================== ");
}
}
DefaultCacheManagerEventListenerFactory.java
package com;
import java.util.Properties;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.event.CacheManagerEventListener;
import net.sf.ehcache.event.CacheManagerEventListenerFactory;
public class DefaultCacheManagerEventListenerFactory extends CacheManagerEventListenerFactory {
@Override
public CacheManagerEventListener createCacheManagerEventListener(
CacheManager cacheManager, Properties props) {
System.out.println("properties:" + props);
return new DefaultCacheManagerEventListener();
}
}
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true" monitoring="autodetect"
dynamicConfig="true">
<!-- 设置磁盘存储目录 -->
<diskStore path="C:\temp\ehcache"/>
<!-- 设置CacheManagerEventListener,当cache被创建或者删除时,会调用listener的相关方法。 -->
<cacheManagerEventListenerFactory class="com.DefaultCacheManagerEventListenerFactory" properties="1=1,2=2,3=3,4=4"/>
<!-- 集群发现其他CacheManager -->
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic,
multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=1"
propertySeparator=","
/>
<!-- 监听集群中消息 -->
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
<!--
maxEntriesLocalHeap:设置堆内存中的最大存储对象。如果设置为0,则没有限制。
eternal: 是指保存元素是否是永久的,如果是,则超时设置会被忽略,元素永远不过期。
timeToIdleSeconds: 设置元素距上一次被访问最长的空闲时间。只有当eternal设置为false是才有效。如果设置0,表示永远不过期。默认值为0.
timeToLiveSeconds: 设置元素的最长生存时间。只有当eternal设置为false是才有效。 如果设置0,表示永远不过期。默认值为0.
diskSpoolBufferSizeMB: 设置磁盘缓冲区大小。默认值为30M。每一个磁盘缓冲区针对与各自的cache。
maxEntriesLocalDisk: 设置堆内存中的最大存储对象。默认值为0.表示没有限制。
diskExpiryThreadIntervalSeconds: 磁盘失效线程运行间隔。默认值为120秒。
memoryStoreEvictionPolicy: 内存收获策略。默认为LRU. 其他可选为FIFO,LFU
sub tab persistence strategy:可选值
localRestartable:将所有缓存对象拷贝到磁盘。重新启动后数据可以重新装载。只适用于企业版本。
localTempSwap:将所有缓存对象拷贝到磁盘。重新启动后数据将丢失。
none:不做持久化保存。默认模式。
distributed:依照<terracotta>持久层配置。
-->
<defaultCache
maxEntriesLocalHeap="1"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskSpoolBufferSizeMB="30"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap" />
</defaultCache>
</ehcache>
测试类Main.java
package com;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
public class Main {
public static void main(String[] args) throws InterruptedException {
Cache cache = CacheControllor.addCache("test");
// 如果cache中存储的element对象数超过maxEntriesLocalHeap指定的对象数,
// 则如果配置类persistence策略不为none,则在指定的目录下会生成.data临时文件
for(int i=0;i<100;i++){
cache.put(new Element("key_"+i,"value_"+i));
}
System.out.println(cache.getSize());
CacheControllor.removeCache("test");
}
}
187

被折叠的 条评论
为什么被折叠?



