缓存加载器
CacheLoader是一个抽象类,它指定如何计算或加载值(如果不存在)。 有两种方法可以创建CacheLoader实例:
- 扩展CacheLoader <K,V>类
- 使用静态工厂方法CacheLoader.from
如果扩展CacheLoader,则需要重写V load(K key)
方法,以指示如何为给定键生成值。 使用静态CacheLoader.from
方法,可以通过提供Function或Supplier接口来构建CacheLoader。 提供功能对象时,会将功能应用于键以计算或检索结果。 使用供应商界面获取的值与密钥无关。
CacheBuilder
CacheBuilder用于构造缓存实例。 它使用流畅的构建样式,并提供了在缓存上设置以下属性的选项:
- 缓存大小限制(删除使用LRU算法)
- 在WeakReferences中包装键(默认情况下,键使用强引用)
- 包装WeakReferences或SoftReferences中的值(默认使用强引用)
- 最后一次访问后到期的时间
- 写入或更新后条目的基于时间的到期
- 设置一个RemovalListener,一旦从缓存中删除一个条目,就可以接收事件
- 缓存的并发级别(默认为4)
并发级别选项用于在内部对表进行分区,以便可以在不发生争用的情况下进行更新。 理想的设置是一次可能访问高速缓存的最大线程数。 这是Guava缓存可能的使用场景的示例。
public class PersonSearchServiceImpl implements SearchService<List<Person>> {public PersonSearchServiceImpl(SampleLuceneSearcher luceneSearcher, SampleDBService dbService) {this.luceneSearcher = luceneSearcher;this.dbService = dbService;buildCache();}@Overridepublic List<Person> search(String query) throws Exception {return cache.get(query);}private void buildCache() {cache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).maximumSize(1000).build(new CacheLoader<String, List<Person>>() {@Overridepublic List<Person> load(String queryKey) throws Exception {List<String> ids = luceneSearcher.search(queryKey);return dbService.getPersonsById(ids);}});}
}
在此示例中,我将缓存条目设置为在写入或更新到缓存中10分钟后过期,最大数量为1,000次。 注意第15行上CacheLoader的用法。
RemovalListener
RemovalListener将收到有关从缓存中删除项目的通知。 这些通知可能来自手动失效,也可能来自由于时间到期或垃圾收集而引起的自动失效。 可以将RemovalListener <K,V>参数设置为侦听特定类型。 要接收任何键或值的通知,请将它们设置为使用对象。 这里应该注意,RemovalListener将接收实现Map.Entry接口的RemovalNotification <K,V>对象。 如果其中一个已被垃圾回收,则键或值可以为null。 同样,键和值对象将是强引用,而不管高速缓存使用的引用的类型如何。
缓存状态
还有一个非常有用的CacheStats类,可以通过调用Cache.stats()来检索它。 CacheStats对象可以给
通过提供以下统计信息,了解缓存的有效性和性能:
- 命中数
- 错过计数
- 总负荷时间
- 总要求
除了上面列出的计数外,CacheStats还提供许多其他计数。
结论
Guava缓存提供了一些非常引人注目的功能。 使用番石榴缓存的决定实际上归结为内存可用性/使用率与性能提升之间的权衡。 我添加了一个单元测试CacheTest,以演示此处讨论的用法。 总是欢迎提出意见和建议。 谢谢你的时间。
资源资源
- 番石榴项目首页
- 缓存API
- 博客系列的源代码
参考: “ 随机编码思考”博客上的JCG合作伙伴 Bill Bejeck的Google Guava Cache 。
翻译自: https://www.javacodegeeks.com/2012/11/google-guava-cache.html