当前位置:首页 > 科技  > 软件

Guava Cache 异步刷新技巧,你值得拥有!

来源: 责编: 时间:2024-01-04 09:33:00 429观看
导读Guava Cache是一款非常优秀的本地缓存框架。这篇文章,我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 。图片1 经典配置Guava Cache 的数据结构跟 JDK1.7 的 ConcurrentHashMap 类似,提供了基于时间、容量、引

Guava Cache是一款非常优秀的本地缓存框架。nBV28资讯网——每日最新资讯28at.com

这篇文章,我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 。nBV28资讯网——每日最新资讯28at.com

图片图片nBV28资讯网——每日最新资讯28at.com

1 经典配置

Guava Cache 的数据结构跟 JDK1.7 的 ConcurrentHashMap 类似,提供了基于时间、容量、引用三种回收策略,以及自动加载、访问统计等功能。nBV28资讯网——每日最新资讯28at.com

图片图片nBV28资讯网——每日最新资讯28at.com

首先,我们温习下 Gauva Cache 的经典配置 。nBV28资讯网——每日最新资讯28at.com

图片图片nBV28资讯网——每日最新资讯28at.com

例子中,缓存最大容量设置为 100 (基于容量进行回收),配置了失效策略和刷新策略。nBV28资讯网——每日最新资讯28at.com

  • 失效策略

配置 expireAfterWrite 后,缓存项在被创建或最后一次更新后的指定时间内会过期。nBV28资讯网——每日最新资讯28at.com

  • 刷新策略

配置 refreshAfterWrite 设置刷新时间,当缓存项过期的同时可以重新加载新值 。nBV28资讯网——每日最新资讯28at.com

这个例子里,有的同学可能会有疑问:为什么需要配置刷新策略,只配置失效策略不就可以吗?nBV28资讯网——每日最新资讯28at.com

当然是可以的,但在高并发场景下,配置刷新策略会有奇效,接下来,我们会写一个测试用例,方便大家理解 Gauva Cache 的线程模型。nBV28资讯网——每日最新资讯28at.com

2  理解线程模型

我们模拟在多线程场景下,「缓存过期执行 load 方法」和「刷新执行 reload 方法」两者的运行情况。nBV28资讯网——每日最新资讯28at.com

图片图片nBV28资讯网——每日最新资讯28at.com

执行结果见下图:nBV28资讯网——每日最新资讯28at.com

图片图片nBV28资讯网——每日最新资讯28at.com

执行结果表明:Guava Cache 并没有后台任务线程异步的执行 load 或者 reload 方法。nBV28资讯网——每日最新资讯28at.com

失效策略:expireAfterWrite 允许一个线程执行 load 方法,其他线程阻塞等待 。当大量线程用相同的 key 获取缓存值时,只会有一个线程进入 load 方法,而其他线程则等待,直到缓存值被生成。这样也就避免了缓存击穿的危险。高并发场景下 ,这样还是会阻塞大量线程。nBV28资讯网——每日最新资讯28at.com

刷新策略:refreshAfterWrite 允许一个线程执行 load 方法,其他线程返回旧的值。单个 key 并发下,使用 refreshAfterWrite ,虽然不会阻塞了,但是如果恰巧同时多个 key 同时过期,还是会给数据库造成压力。nBV28资讯网——每日最新资讯28at.com

为了提升系统性能,我们可以从如下两个方面来优化 :nBV28资讯网——每日最新资讯28at.com

  1. 配置  refresh < expire ,减少大量线程阻塞的概率;
  2. 采用异步刷新的策略,也就是线程异步加载数据,期间所有请求返回旧的缓存值,防止缓存雪崩。

下图展示优化方案的时间轴 :nBV28资讯网——每日最新资讯28at.com

图片图片nBV28资讯网——每日最新资讯28at.com

3 两种方式实现异步刷新

3.1 重写 reload 方法

图片图片nBV28资讯网——每日最新资讯28at.com

3.2 实现 asyncReloading 方法

图片图片nBV28资讯网——每日最新资讯28at.com

不管使用哪种方案, 都需要定义单独的线程池来执行刷新任务 。nBV28资讯网——每日最新资讯28at.com

4 异步刷新 + 多级缓存

2018 年,笔者服务的一家电商公司需要进行 app 首页接口的性能优化。笔者花了大概两天的时间完成了整个方案,采取的是两级缓存模式,同时采用了 Guava 的异步刷新机制。nBV28资讯网——每日最新资讯28at.com

整体架构如下图所示:nBV28资讯网——每日最新资讯28at.com

图片图片nBV28资讯网——每日最新资讯28at.com

缓存读取流程如下 :nBV28资讯网——每日最新资讯28at.com

  • 业务网关刚启动时,本地缓存没有数据,读取 Redis 缓存,如果 Redis 缓存也没数据,则通过 RPC 调用导购服务读取数据,然后再将数据写入本地缓存和 Redis 中;若 Redis 缓存不为空,则将缓存数据写入本地缓存中。
  • 由于步骤1已经对本地缓存预热,后续请求直接读取本地缓存,返回给用户端。
  • Guava 配置了 refresh 机制,每隔一段时间会调用自定义 LoadingCache 线程池(5个最大线程,5个核心线程)去导购服务同步数据到本地缓存和 Redis 中。

优化后,性能表现很好,平均耗时在 5ms 左右,同时大幅度的减少应用 GC 的频率。nBV28资讯网——每日最新资讯28at.com

该方案依然有瑕疵,一天晚上我们发现 app 端首页显示的数据时而相同,时而不同。nBV28资讯网——每日最新资讯28at.com

也就是说:虽然 LoadingCache 线程一直在调用接口更新缓存信息,但是各个服务器本地缓存中的数据并非完成一致。nBV28资讯网——每日最新资讯28at.com

这说明了两个很重要的点:nBV28资讯网——每日最新资讯28at.com

  • 惰性加载仍然可能造成多台机器的数据不一致;
  • LoadingCache 线程池数量配置的不太合理,  导致了任务堆积。

最终,我们的解决方案是:nBV28资讯网——每日最新资讯28at.com

  • 异步刷新结合消息机制来更新缓存数据,也就是:当导购服务的配置发生变化时,通知业务网关重新拉取数据,更新缓存。
  • 适当调大 LoadingCache 的线程池参数,并在线程池埋点,监控线程池的使用情况,当线程繁忙时能发出告警,然后动态修改线程池参数。

5 总结

Guava Cache 非常强大,它并没有后台任务线程异步的执行 load 或者 reload 方法,而是通过请求线程来执行相关操作。nBV28资讯网——每日最新资讯28at.com

为了提升系统性能,我们可以从如下两个方面来处理 :nBV28资讯网——每日最新资讯28at.com

  • 配置 refresh < expire,减少大量线程阻塞的概率。
  • 采用异步刷新的策略,也就是线程异步加载数据,期间所有请求返回旧的缓存值。

笔者曾经优化过某电商网站的首页接口,使用的方案是:Guava 的异步刷新机制 + 多级缓存 ,取得了非常好的优化效果。nBV28资讯网——每日最新资讯28at.com

尽管如此,我们在使用这种方式时,依然需要考虑的缓存和数据库一致性问题。nBV28资讯网——每日最新资讯28at.com

参考资料:nBV28资讯网——每日最新资讯28at.com

https://albenw.github.io/posts/df42dc84/nBV28资讯网——每日最新资讯28at.com


nBV28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-57379-0.htmlGuava Cache 异步刷新技巧,你值得拥有!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 突破 Pytorch 核心点,损失函数 !!!

下一篇: 性能篇:String慎重使用正则表达式?

标签:
  • 热门焦点
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top