标签:void 先进先出 bsp 超出 容量 XML 取数 丢失 com
对于上述缓存类型的使用,可以采用存储最热的数据到堆缓存,相对热的数据到堆外缓存,全量数据到分布式缓存。下面就来看下每一种类型怎么使用,示例写在real_server_1项目中。
<!-- guava版本 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
private static void guavaHeap() throws InterruptedException {
Cache<String, String> myCache = CacheBuilder.newBuilder()
.concurrencyLevel(4) // 并发级别,即ConcurrentHashMap segment数量,越大并发能力越强
.expireAfterWrite(10, TimeUnit.SECONDS) // 设置过期TTL
.maximumSize(10000) // 设置缓存的容量,当超出时,按照LRU进行回收
.build();
myCache.put("guava", "heap_guava");
while (true) {
String value = myCache.getIfPresent("guava");
if (value == null) {
System.out.println("Cache expired");
return;
} else {
System.out.println(value);
}
Thread.sleep(1000);
}
}
<!-- mapdb -->
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.0.5</version>
</dependency>
private static void mapdbDirect() throws InterruptedException {
HTreeMap myCache = DBMaker.memoryDirectDB()
.concurrencyScale(16)
.make().hashMap("myCache")
.expireStoreSize(64 * 1024 * 1024)
.expireMaxSize(10000)
.expireAfterCreate(10, TimeUnit.SECONDS)
.expireAfterUpdate(10, TimeUnit.SECONDS)
.expireAfterGet(10, TimeUnit.SECONDS)
.create();
myCache.put("mapdb", "direct_mapdb");
System.out.println(myCache.get("mapdb"));
Thread.sleep(15000);
System.out.println(myCache.get("mapdb"));
}
private static void mapdbDisk(){
DB db = DBMaker.fileDB("/Users/zhangjing/mpdb.data")
.fileMmapEnable() // 启用mmap
.fileMmapEnableIfSupported() // 在支持的平台上启用mmap
.fileMmapPreclearDisable() // 让mmap更快
.cleanerHackEnable() // 一些BUG处理
.transactionEnable() // 启用事务
.closeOnJvmShutdown()
.concurrencyScale(16).make();
HTreeMap myCache = db.hashMap("myCache")
.expireMaxSize(10000)
.expireAfterCreate(10, TimeUnit.SECONDS)
.expireAfterUpdate(10, TimeUnit.SECONDS)
.expireAfterGet(10, TimeUnit.SECONDS)
.createOrOpen();
myCache.put("mapdb", "disk_mapdb");
db.commit();
}
上面简单地过下集中缓存的皮毛,在具体使用过程中还得逐个深入研究。
已经有前人给我们总结了模式的使用场景,主要分为两大类:Cache-Aside和Cache-As-SoR(Read-through、Write-through、Write-behind)。首先介绍三个名词:
Cache-Aside即业务代码围绕着Cache写,是由业务代码直接维护缓存:
推荐:DotNET企业架构应用实践-系统架构与性能-缓存技术与ORM中的缓存查询技术
[系列回顾 在前面的文章DotNET企业架构应用实践-系统架构与性能-理论依据及相关做法一文中我介绍了系统性能优化的理论做了一个概括的介绍,也简单的介绍了性能优化的
Cache-Aside可以用AOP模式去实现。
Cache-As-SoR即把Cache看做SoR,所有操作都是对Cache进行,然后Cache再委托给SoR进行真是的读/写。即业务代码中只看到Cache的操作,看不到关于SoR的相关代码。有三种实现:Read-Through、Write-Through、Write-Behind。
Read-through,业务代码首先调用Cache,如果Cache不命中由Cache回源到SoR,而不是业务代码(即由Cache读SoR)。使用Read-through模式,需要配置一个CacheLoader组件用来回源SoR加载源数据。
Write-Through被称为穿透写模式/直写模式,业务代码首先调用Cache写(新增/修改)数据,然后由Cache负责写缓存和写SoR,而不是由业务代码。使用Write-Through模式需要配置一个CacheWriter组件来回写SoR。
Write-Behind也叫做 Write-Back,我们称之为回写模式。不同于Write-Through是同步写SoR和Cache,Write-Behind是异步写。异步之后可以实现批量写、合并写、延时写和限流。
这部分代码就不贴出来了,可以选择适合自己的缓存方式再深入研究。
[节选自最新出版的《深入分布式缓存》一书"缓存在社交网络Feed系统中的架构实践"一章的第一、二小节。 在社交网络发展如火如荼的今天,人们越来越倾向于用新媒介来展现自我
标签:void 先进先出 bsp 超出 容量 XML 取数 丢失 com
原文地址:https://www.cnblogs.com/mengbin0546/p/12612294.html