Guava Cache 使用笔记
https://www.cnblogs.com/parryyang/p/5777019.html
https://www.cnblogs.com/shoren/p/guava_cache.html
Java 高并发缓存与Guava Cache
Guava Cache与ConcurrentMap很相似,Guava Cache能设置回收,能解决在大数据内存溢出的问题,源代码如下:
http://blog.csdn.net/congcong68/article/details/41146295
http://www.jianshu.com/p/afe7b2dccee0
Guava Cache的使用
本文部分内容翻译自官方文档,部分内容和示例根据自己的理解完成
原文地址:https://github.com/google/guava/wiki/CachesExplained
Guava Cache的适用场景
Cache(缓存)在很广泛的场景下都是很有用的。比如,当一个值的计算或者检索的代价很大,并且在稍后的特定输入发生后,你将不止一次的需要这个值的时候,就应当考虑使用Cache了。
Cache是和ConcurrentMap很相像的东西。最本质的不同就是,ConcurrentMap持有所有被添加进的元素,直到它们专门被移除。从另一方面来说,为了使得内存的使用可控,Cache通常来说是可配置来自动回收元素的。在一些情况下,即使LoadingCache也会很有用,虽然由于他的自动缓存加载机制,它不回收元素。
通常,Guava Cache组件在下面的场景中适用:
- 你想花费一些内存来提高速度。
- 你预期到一些key的值将被不止一次地被查询。
- 你的缓存将不会需要比内存能够存储的数据更多。(Guava Cache对于一个单独运行的应用来说是本地的。它们不回将数据存储在文件中或者外部服务器上。如果这不适合你的需求,那么考虑使用其它的工具,比如Memcached)
如果上面的这些都符合你的需要,那么Guava Cache组件将适合你!
获得一个Cache是使用CacheBuilder来完成的。
注意:如果你不需要Cache的一些特性,那么ConcurrentHashMap是更加有内存效率的--但是使用任何旧的ConcurrentMap都会很难或者几乎不可能去完成Cache所支持的一些特性。
Guava Cache的使用示例
使用缓存时,最常遇到的场景需要就是:
"获取缓存-如果没有-则计算"[get-if-absent-compute]的原子语义.
具体含义:
- 从缓存中取。
- 缓存中存在该数据,直接返回;
- 缓存中不存在该数据,从数据源中取。
- 数据源中存在该数据,放入缓存,并返回;
- 数据源中不存在该数据,返回空。
下面这段代码实现了一个做在DAO层的本地缓存。其中,getPOIList()是对外提供的方法,该方法中实现了上述逻辑。getPOIListFromDB()是用于模拟从数据库中取数据的方法。
import com.google.common.base.Optional;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.collect.ImmutableList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
public class Dao {
Cache<String, List<String>> poiCache = CacheBuilder.newBuilder().build();
@SuppressWarnings("unchecked")
public List<String> getPOIList(final String cityId) {
List returnList = null;
try {
returnList = poiCache.get(cityId, new Callable<List<String>>() {
@Override
public List<String> call(){
return getPOIListFromDB(cityId);
}
});
} catch (ExecutionException e) {
// 记日志
}
return Optional.fromNullable(returnList).or(Collections.EMPTY_LIST);
}
@SuppressWarnings("unchecked")
private List<String> getPOIListFromDB(String cityId){
System.out.println("getting from DB, please wait...");
List<String> returnList = null;
// 模仿从数据库中取数据
try {
Thread.sleep(1000);
switch (cityId){
case "0101" :
returnList = ImmutableList.of("望京", "望京西", "望京南", "望京北"); break;
case "0102" :
returnList = ImmutableList.of("a", "b", "c", "d"); break;
}
} catch (Exception e) {
// 记日志
}
return Optional.fromNullable(returnList).or(Collections.EMPTY_LIST);
}
}
用于测试的主方法:
import java.util.Arrays;
public class CacheTest {
public static void main(String[] args) {
Dao dao = new Dao();
for (int i = 0; i < 3; i++) {
System.out.println("--- " + i + " ---");
System.out.println(Arrays.toString(dao.getPOIList("0101").toArray()));
System.out.println(Arrays.toString(dao.getPOIList("0102").toArray()));
System.out.println(Arrays.toString(dao.getPOIList("0103").toArray()));
System.out.println();
}
}
}
控制台输出:
--- 0 ---
getting from DB, please wait...
[望京, 望京西, 望京南, 望京北]
getting from DB, please wait...
[a, b, c, d]
getting from DB, please wait...
[]
--- 1 ---
[望京, 望京西, 望京南, 望京北]
[a, b, c, d]
[]
--- 2 ---
[望京, 望京西, 望京南, 望京北]
[a, b, c, d]
[]
运行后的输出结果表明了,只有第一次是从DB中取的数据,之后的两次都是从cache中取得的。
为什么要把Cache对象放在DAO层?
思考一下Cache的用途,能够想到在一个Application中,对同一种对象的缓存只需要一个就够了。比如示例中的poiCache是缓存city对应的poi信息的,那么在这个Application中最好只存在一个poiCache。
实现这样的要求有以下几种方式:
- Spring的Singleton模式(推荐)
比较常见的做法是将Server和DAO都作为单例的bean交给Spring容器管理,而将缓存放在DAO层不但实现了单例,也更合理(数据的缓存策略本身就应是数据访问层的一部分)。 - 静态初始化(不推荐)
我刚开始使用时还以为Guava Cache跟HashMap一样,get(null)返回null。
http://blog.csdn.net/albertfly/article/details/51971086
Guava Cache 使用笔记的更多相关文章
- Guava学习笔记:Guava cache
缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间. 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用 ...
- Guava Cache探索及spring项目整合GuavaCache实例
背景 对于高频访问但是低频更新的数据我们一般会做缓存,尤其是在并发量比较高的业务里,原始的手段我们可以使用HashMap或者ConcurrentHashMap来存储. 这样没什么毛病,但是会面临一个问 ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- [Java 缓存] Java Cache之 Guava Cache的简单应用.
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项 ...
- Ehcache与Guava Cache的区别浅谈
最近在做一些缓存改造的场景,有如下一些经验总结: 缓存版本: Ehcache:2.8.3 Guava:17.0 Ehcache支持持久化到本地磁盘,Guava不可以: Ehcache有现成的集群解决方 ...
- guava cache
适用场景 缓存在很多场景下都是相当有用的.例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存. Guava Cache与ConcurrentMap很相似,但 ...
- 第七章 企业项目开发--本地缓存guava cache
1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...
- (翻译)Google Guava Cache
翻译自Google Guava Cache This Post is a continuation of my series on Google Guava, this time covering G ...
- 是什么让spring 5放弃了使用Guava Cache?
一路走来,Spring社区从刚开始的核心模块一直发展到现在,最近Sping5也完成了M5的发布, 相信不久之后第一个RELEASE版本也会发布.里面有很多特性是和即将要发布的JAVA 9息息相关的.今 ...
随机推荐
- 【DP】【P1586】四方定理
传送门 Description Input 第一行为一个整数T代表数据组数,之后T行每行一个数n代表要被分解的数 Output 对于每个n输出一行,为方案个数 Sample Input Sample ...
- 如何按需动态加载js文件
JavaScript无非就是script标签引入页面,但当项目越来越大的时候,单页面引入N个js显然不行,合并为单个文件减少了请求数,但请求的文件体积却很大.这时候最好的做法就是按需引入,动态引入组件 ...
- Random Numbers Gym - 101466K dfs序+线段树
Tamref love random numbers, but he hates recurrent relations, Tamref thinks that mainstream random g ...
- HTMLajax跨域向服务器写入数据
1.XMLHttpRequest升级版已经实现了跨域请求.不过需要在后台设置:header("Access-Control-Allow-Origin:http://www.a.com&quo ...
- Activity及Intent
1.Activity 在一个Android应用程序中,Activity是为用户操作而展示的可视化界面.比如你要打电话,这个时候的拨号界面就是一个Activity,你要发短信给你的女朋友,这个短信窗口就 ...
- ZooKeeper配额指南(十)
配额 ZK有命名空间和字节配额.你可以使用ZooKeeperMain类来设置配额.ZK打印警告信息如果用户超过分配给他们的配额.这些信息被打印到ZK的日志中. $java -cp zookeeper. ...
- Ubuntu 15.04 编译UE4 for Linux版
源 起 Unreal Engine 4 是全球最先进的Realtime Illumination & Physical 引擎: 长期以来,UE4都只有Windows版和Mac版,今年终于向Li ...
- JAVA中3种将byte转换为String的方法
HttpClient 类库中GetMethod类的getResponseBody方法返回的是byte[]类型,要操作起来不方便,我想把它转化成String类型. 查了网上的资料,有说法认为用这种方法比 ...
- 【BZOJ4869】相逢是问候 [线段树][欧拉定理]
相逢是问候 Time Limit: 40 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Informatikverbin ...
- 作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars
作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars 一.为什么需要使用模板引擎? 关于为什么要使用模板引擎,按照我常对学生说的一句话就是:不用重复造轮子.. 简单来说,模板最 ...