Google Guava缓存

这篇文章是我在Google Guava上系列文章的续篇,这次涵盖了Guava Cache。 与HashMap或ConcurrentHashMap相比,Guava Cache提供了更大的灵活性和功能,但不像使用EHCache或Memcached那样繁重(就此而言,它很健壮,因为Guava Cache仅在内存中运行)。 Cache接口具有您希望看到的方法,例如“ get”和“ invalidate”。 您找不到的方法是'put',因为Guava Cache是​​'self-populated',因此将获取或计算在请求时不存在的值,然后将其存储。 这意味着“ get”调用将永远不会返回null。 公平地说,上一声明并非100%准确。 还有另一种方法“ asMap”,将缓存中的条目公开为线程安全映射。 使用'asMap'将导致不执行任何自加载操作,因此,如果不存在该值,则对'get'的调用将返回null(这有什么意思?)。 尽管这是有关Guava Cache的文章,但我将花大量时间谈论CacheLoader和CacheBuilder。 CacheLoader指定如何加载值,并且CacheBuilder用于设置所需的功能并实际构建缓存。

缓存加载器

CacheLoader是一个抽象类,它指定如何计算或加载值(如果不存在)。 有两种方法可以创建CacheLoader实例:

  1. 扩展CacheLoader <K,V>类
  2. 使用静态工厂方法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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html 三列布局(两列自适应,一列固定宽度)

不做过多解释&#xff1a;主要是记录一个完整的布局样式&#xff0c;实现页面大致三列其中左右两列是自适应宽度&#xff0c;中间固定宽度效果。 不多少代码奉上&#xff1a; CSS样式代码&#xff1a; /*********************公共标签样式********************//************…

jsp常用动作

jsp:include 动态包含&#xff1b; jsp:forward 转发&#xff1b; jsp:useBean 实例化bean对象&#xff1b; jsp:setProperty 设置一个属性值 jsp:getProperty 获取一个属性值 jsp:param 动态传参数&#xff1b; jsp:plugin 生成一个插件 jsp:useBean 实例化一个对象…

单曲循环 翻译_歌单 | 单曲循环amp;热评

December2020/12/ 写在前面的话 /本来打算在跨年的时候才更文&#xff0c;但是吧又觉得空出这最后一个月有点苍白&#xff0c;然后最近一直夜半网抑云(敏感ing)就想到可以做一期分享歌单的推文&#xff0c;分享一些最近听得频繁的歌曲(还不是刷抖音刷出来的)。《暧昧》// 王菲徘…

python的字符串内建函数

python的字符串内建函数 字符串方法是从python1.6到2.0慢慢加进来的——它们也被加到了Jython中。 这些方法实现了string模块的大部分方法&#xff0c;如下表所示列出了目前字符串内建支持的方法&#xff0c;所有的方法都包含了对Unicode的支持&#xff0c;有一些甚至是专门用…

休息使用Jersey –包含JAXB,异常处理和客户端程序的完整教程

最近&#xff0c;我开始使用Jersey API开发一个Restful Web服务项目。 在线提供了一些教程&#xff0c;但是我遇到了异常处理方面的一些问题&#xff0c;而且在使用JaxB和提供异常处理方法的完整项目中找不到任何地方。 因此&#xff0c;一旦我能够使用带有异常处理和客户端程序…

python基于web可视化_独家 | 基于Python实现交互式数据可视化的工具(用于Web)

转自&#xff1a;数据派ID&#xff1a;datapi 作者&#xff1a;Alark Joshi 翻译&#xff1a;陈雨琳 校对&#xff1a;吴金笛 本文2200字&#xff0c;建议阅读8分钟。 本文将介绍实现数据可视化的软件包。 这学期&#xff08;2018学年春季学期&#xff09;我教授了一门关于数据…

SASS简介及使用方法

一、什么是Sass Sass (Syntactically Awesome StyleSheets)是css的一个扩展开发工具&#xff0c;它允许你使用变量、条件语句等&#xff0c;使开发更简单可维护。这里是官方文档。 二、基本语法 1&#xff09;变量 sass的变量名必须是一个$符号开头&#xff0c;后面紧跟变量名…

【转】Java方向如何准备BAT技术面试答案(汇总版)

原文地址&#xff1a;http://www.jianshu.com/p/1f1d3193d9e3 这个主题的内容之前分三个篇幅分享过&#xff0c;导致网络上传播的比较分散&#xff0c;所以本篇做了一个汇总&#xff0c;同时对部分内容及答案做了修改&#xff0c;欢迎朋友们吐槽、转发。因为篇幅长度和时间的原…

numpy维度交换_“lazy”的transpose()函数——从numpy 数组的内存布局讲起

1 数组的两种内存布局方式行优先与列优先首先我们回顾一下&#xff0c;矩阵数据在内存中的两种布局方式&#xff1a;行优先&#xff08;row-major&#xff09;&#xff1a;以行为优先单位&#xff0c;在内存中逐行存储/读取&#xff1b;对于多维&#xff0c;意味着当线性扫描内…

云耀服务器切换系统,【计算】云耀服务器-常见操作汇总指南

通过上期的介绍&#xff0c;相信大家对于云耀云服务器的基本知识有了一个了解。云耀云服务器是一个具备独立、完整的操作系统和网络功能&#xff0c;可快速搭建简单应用的新一代云服务器。接下来&#xff0c;本期为大家带来关于云耀云服务器使用中的一些简单方法和小技巧。1.云…

机器学习应该准备哪些数学预备知识?

转 https://www.zhihu.com/question/36324957 https://www.zhihu.com/question/36324957/answer/139408269 机器学习应该准备哪些数学预备知识&#xff1f; 数据分析师&#xff0c;工作中经常使用机器学习模型&#xff0c;但是以调库为主。 自己一直也在研究算法&#xff0c;也…

react usecontext_Vue3原理实战运用,我用40行代码把他装进了React做状态管理

前言vue-next是Vue3的源码仓库&#xff0c;Vue3采用lerna做package的划分&#xff0c;而响应式能力vue/reactivity被划分到了单独的一个package中。如果我们想把它集成到React中&#xff0c;可行吗&#xff1f;来试一试吧。使用示例话不多说&#xff0c;先看看怎么用的解解馋吧…

Spring MVC –自定义RequestMappingHandlerMapping

在xml bean定义文件中使用<mvc&#xff1a;annotation-driven />配置Spring MVC时&#xff0c;在内部将一个名为RequestMappingHandlerMapping的组件注册到Spring MVC。 该组件或通常是HandlerMapping组件负责将请求URI路由到处理程序&#xff0c;这些处理程序是使用Requ…

css的三个特性 背景透明设置

关于行内元素&#xff08;补充一点&#xff09; 行内元素只能容纳文本或其他行内元素。&#xff08;a特殊a里面可以放块级元素&#xff09; 例子&#xff1a; 关于行高tip: 选择器的嵌套层级不应大于3级&#xff0c;位置靠后的限定条件应尽可能的精确。 属性定义必须另起一行…

比较容易犯的一些智障错误(不定时修改)

无论在什么学习中&#xff0c;在成长的过程中&#xff0c;注定要犯一些错误&#xff0c;有些比较高级的错误&#xff0c;有些是比较智障的错误。那么在oi的学习中&#xff0c;我们最讨厌的就是一些智障的小错误&#xff0c;因为如果是大错误的话一般情况下在测试样例的时候都是…

ccs安装多版本编译器离线_大数据分析:学习工具JDK,在线安装指南

hadoop是使用Java语言开发的并且Hadoop运行需要有Java环境的支持&#xff0c;因此在安装hadoop之前需要安装Java开发环境即JDK(Java Development Kit)。安装前首先向大家介绍以一下本文会用到的几个词&#xff1a;JAVA_HOME:一是为了方便引用&#xff0c;比如&#xff0c;JDK安…

HTML基础入门学习准备篇

在学习前端的开始&#xff0c;让我们一起来了解什么是HTML5时代的大前端开发和全栈开发的定义传统的前端&#xff1a;切图-标签和样式-实现效果H5时代的前端&#xff1a;一、需要各端的兼容开发二、可以用于APP开发和移动站点的开发三、Ajax服务器端技术开发四、高级设计模式和…

asp.net尚未在web服务器上注册_最新版Web服务器项目详解 00 项目概述

点 击 关 注 上 方&#xff02;两猿社&#xff02;设 为&#xff02;置 顶 或 星 标&#xff02;&#xff0c;干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社TineyWebServerLinux下C轻量级Web服务器&#xff0c;助力初学者快速实践网络编程&#xff0c;搭建属于自己的服务器…

python正则r的作用_Python正则表达式,这一篇就够了!

原标题&#xff1a;Python正则表达式&#xff0c;这一篇就够了&#xff01;大多数编程语言的正则表达式设计都师从Perl&#xff0c;所以语法基本相似&#xff0c;不同的是每种语言都有自己的函数去支持正则&#xff0c;今天我们就来学习 Python中关于 正则表达式的函数。re模块…

服务器微信了早上好,每天早上好的问候语 微信早安问候语合集66句

1、没有伞的孩子&#xff0c;必须努力奔跑&#xff01;早安&#xff01;2、你不能改变过去&#xff0c;但你可以改变未来。早安&#xff01;3、坚持了才叫梦想&#xff0c;放弃了就只是妄想。早安&#xff01;4、忘掉失败&#xff0c;不过要牢记失败中的教训。早安&#xff01;…