1堆内
直接在JVM堆中存储JAVA对象,优点是速度快;缺点是会增加GC的频次和GC时间。
2堆外
在堆外内存中存储序列化的JAVA对象,优点是不会增加GC;缺点是存取速度较慢,需要额外的时间处理序列化和反序列化。
3 磁盘
缓存数据到磁盘,优点是掉电不会丢失数据,可用空间更大;缺点是存取速度比堆外慢很多。
4三种结构一起使用,结构如上图。
5时序图
在Ehcache的多层缓存结构中,最底层被称为Authoritative Tier,其余的缓存层被称为Caching Tier。Authoritative Tier层数据是最全的,其余层的数据都是该层的数据子集,只是临时存储数据。
比如,堆内+堆外模式中,堆外为Authoritative Tier。堆内+堆外+磁盘模式中,磁盘为Authoritative Tier。
6 序列化
堆外和磁盘存储时,必须先将对象序列化为java.nio.ByteBuffer,Ehcache允许用户按下面的代码传入自定义的序列化类。
7 转一个demo
import java.io.File;
import org.ehcache.Cache;
import org.ehcache.PersistentCacheManager;
import org.ehcache.UserManagedCache;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.config.builders.UserManagedCacheBuilder;
import org.ehcache.config.units.EntryUnit;
import org.ehcache.config.units.MemoryUnit;
public class Main {
public static void main(String[] args) {
PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(getStoragePath() + File.separator + "myData"))
.withCache("threeTieredCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES) //堆
.offheap(1, MemoryUnit.MB) //堆外
.disk(20, MemoryUnit.GB) //磁盘
)
).build(true);
Cache threeTieredCache = persistentCacheManager.getCache("threeTieredCache", Integer.class, String.class);
//读
for (int i=0;i<=20000;i++){
threeTieredCache.put(i, "$"+i);
}
//写
for (int i=0;i<=200000;i++){
String value = threeTieredCache.get(i);
System.out.println("get at "+i+":"+value);
}
persistentCacheManager.close();
}
private static String getStoragePath() {
// TODO Auto-generated method stub
return "d:";
}
}
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。