CPU缓存、操做系统缓存、本地缓存、分布式缓存、Http缓存、数据库缓存。数据库
1) 你愿意消耗一些内存空间来提高速度。缓存
2) 你预料到某些键会被查询一次以上。服务器
3) 缓存中存放的数据总量不会超过内存容量。(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或者外部服务器上。)分布式
LoadingCahce是附带CacheLoader构建而成的缓存实现。构建本身的CacheLoader一般只须要简单地实现V load(K key) throws Exception方法。例如,你可使用下面的代码构建LoadingCache函数
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .maximumSize(1000) .build( new CacheLoader<Key, Graph>() { public Graph load(Key key) throws AnyException { return createExpensiveGraph(key); } }); ... try { return graphs.get(key); } catch (ExecutionException e) { throw new OtherException(e.getCause()); }
从LoadingCache中get数据的正规方式是get(K)方法。这个方法要么返回已经缓存的值,要么使用CacheLoader向缓存原子地加载新值。因为CacheLoader可能抛出异常,LoadingCache.get(K) 也声明为抛出ExecutionException异常。若是你定义的CacheLoader没有声明任何检查异常,则能够经过getUnchecked(K)查找缓存;但必须注意,一旦CacheLoader声明了检查异常,就不能够调用getUnchecked(K) 。ui
getAll(Iterable<? extends K>) 方法用来执行批量查询。默认状况下,对每一个不在缓存中的键,getAll方法会单独调用CacheLoader.load来加载缓存项。若是批量的加载比多个单个加载更有效,你能够重载CacheLoader.loadAll来利用这一点。spa
2) 使用Callable
Callable支持get(K , Callable<K>) 方法。这个方法可以实现要么返回缓存中已经存在的相应值,要么用给定的Callable运算并把结果加入到缓存中。这个方法简单地实现了模式“若是有缓存则返回;不然运算、缓存、而后返回”。在调用get时传入一个Callable实例,能够覆盖默认的加载运算。操作系统
若是要规定缓存项的数目不超过固定值,只须要使用CacheBuilder.maximumSize(Long)。缓存将尝试回收最近没有使用或整体上不多使用的缓存项。另外,不一样的缓存项有不一样的“权重”——例如,若是你的缓存值,占据彻底不一样的内存空间,你可使用CacheBuilder.weigher(Weigher)指定一个权重函数,而且用CacheBuilder.maxinumWeight(long)指定最大总量。重量实在缓存建立时计算的,所以要考虑重量计算的复杂度。 code
expireAfterAccess(long,TimeUnit):缓存项在给定时间内没有被读写访问,则回收。请注意这种缓存的回收顺序和基于大小回收同样。blog
expireAfterWrite(long,TimeUnit):缓存项在给定时间内没有被写访问(建立或覆盖),则回收。若是认为缓存数据老是在固定时候后变的陈旧不可用,这种回收是可取的。