Guava Cache本地缓存总结
1.缓存分类
CPU缓存、操作系统缓存、本地缓存、分布式缓存、Http缓存、数据库缓存。
2.Guava Cache缓存适用场景
1) 你愿意消耗一些内存空间来提升速度。
2) 你预料到某些键会被查询一次以上。
3) 缓存中存放的数据总量不会超过内存容量。(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或者外部服务器上。)
3.Guava Cache 创建的方式
1) LoadingCache
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) 。
getAll(Iterable<? extends K>) 方法用来执行批量查询。默认情况下,对每个不在缓存中的键,getAll方法会单独调用CacheLoader.load来加载缓存项。如果批量的加载比多个单个加载更有效,你可以重载CacheLoader.loadAll来利用这一点。
2) 使用Callable
Callable支持get(K , Callable<K>) 方法。这个方法能够实现要么返回缓存中已经存在的相应值,要么用给定的Callable运算并把结果加入到缓存中。这个方法简单地实现了模式“如果有缓存则返回;否则运算、缓存、然后返回”。在调用get时传入一个Callable实例,可以覆盖默认的加载运算。
Guava缓存回收策略
1).基于容量的回收
如果要规定缓存项的数目不超过固定值,只需要使用CacheBuilder.maximumSize(Long)。缓存将尝试回收最近没有使用或总体上很少使用的缓存项。另外,不同的缓存项有不同的“权重”——例如,如果你的缓存值,占据完全不同的内存空间,你可以使用CacheBuilder.weigher(Weigher)指定一个权重函数,并且用CacheBuilder.maxinumWeight(long)指定最大总量。重量实在缓存创建时计算的,因此要考虑重量计算的复杂度。
2).定时回收
expireAfterAccess(long,TimeUnit):缓存项在给定时间内没有被读写访问,则回收。请注意这种缓存的回收顺序和基于大小回收一样。
expireAfterWrite(long,TimeUnit):缓存项在给定时间内没有被写访问(创建或覆盖),则回收。如果认为缓存数据总是在固定时候后变的陈旧不可用,这种回收是可取的。