Guava Cache使用的三种姿势
姿势一
使用expiredAferWriter
优点
- 简单
- 粗暴
缺点
- 同步阻塞问题:如果多个线程同时请求同一个过期的key,只有一个线程能够获得去加载缓存的锁,但是其他未获取加载缓存锁的线程也会阻塞。
show me the code
姿势二
使用expiredAfterWrite + refreshAfterWrite
使用注意
指定refreshAferWrite的时间小于expiredAfterWrite
必须使用LoadingCache
直接使用get获取缓存
优点
- 当到达刷新时间之后,只会有一个线程获得刷新缓存的锁,其他线程直接返回缓存中的旧值,仅阻塞刷新缓存的线程
缺点
- 刷新缓存的线程还是会被阻塞
show me the code
姿势三
使用expiredAfterWrite + refreshAfterWrite + ListenableFuture
优点
- 刷新缓存的线程也不会被阻塞,而是直接返回
缺点
- 刷新缓存的线程得到的仍然是旧值
- 缓存的刷新或者重新加载还是得靠外部请求触发,不能完全达到定时刷新效果
注意
1. 不管上面那种方式,缓存的加载和刷新都需要外部调用(get)才触发
2. 使用姿势二和三要注意缓存的刷新过期时间要设置的比加载过期时间短,否则体现不出优势
3. 如果当前请求缓存时间距离最后一次时间已经超过过期时间,则会调用加载(load)方法而非刷新(reload)方法来加载缓存,此时会回退到姿势一
4. 刷新缓存的同时也会刷新缓存下次过期的时间(在当前时间累加过期时间)
5. 具体逻辑参照**com.google.common.cache.LocalCache$Segment**。这里贴出一些关键逻辑供各位参考:
只有在value!=null的时候(既未达到过期时间时)才会调用refresh方法
注册了一个Listener来实现异步刷新
Guava Cache使用的三种姿势的更多相关文章
- ASP.NET缓存中Cache过期的三种策略
原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...
- 浅谈OC对象初始化的三种姿势
一.普通程序猿普通程序员使用最常见路人姿势等场.普普通通,纯属陆仁辈. 陆仁贾写法: // view 1 UIView *v1 = [UIView alloc] initWithFrame:CGRec ...
- Django之session验证的三种姿势
一.什么是session session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中. 二.FVB中 ...
- go 中解析JSON的三种姿势
背景 这是一篇写给0-1年新人的文章,短平快的教会你如何解析json字符串. 示例Json 假设有如下json字符串: { "userName":"admin" ...
- 正确开启Mockjs的三种姿势:入门参考(一)
一.文章初衷 阅读本文章需要注意以下几点: 文章不主要介绍Mockjs的使用语法 文章暂不涉及Mockjs的第三方封装框架 文章会结合以往做过上线项目的方式总结 想主要介绍如何使用Mockjs,是因为 ...
- 理解Promise的三种姿势
译者按: 对于Promise,也许你会用了,却并不理解:也许你理解了,却只可意会不可言传.这篇博客将从3个简单的视角理解Promise,应该对你有所帮助. 原文: Three ways of unde ...
- Guava Cache源码解析
概述: 本次主要是分析cache的源码,基本概念官方简介即可. 基本类图: 在官方的文档说明中,Guava Cache实现了三种加载缓存的方式: LoadingCache在构建缓存的时候,使用buil ...
- guava cache使用和源码分析
guava cache的优点和使用场景,用来判断业务中是否适合使用此缓存 介绍常用的方法,并给出示例,作为使用的参考 深入解读源码. guava简介 guava cache是一个本地缓存.有以下优点: ...
- Guava cache功能简介(转)
原文链接:http://ifeve.com/google-guava-cachesexplained/ 范例 LoadingCache<Key, Graph> graphs = Cache ...
随机推荐
- 英特尔Intel® Arria® 10 FPGA加速器设计
英特尔Intel Arria 10 FPGA加速器设计 Introducing the Intel Vision Accelerator Design with Intel Arria 10 FPGA ...
- BeetleX之Vue ElementUI生成工具
BeetleX.WebFamily在新版本的功能中引入了一个全新的功能,通过这一功能可以大大节省UI的开发工作量.组件集成了一个图形化的UI编辑器,可以连接数据库对数据表或查询快速度生成编辑和数据查询 ...
- Java后端精选技术:SpringBoot配置读取
在早前的博客中曾经写过 Spring 程序通过 Bean 映射实现配置信息的读取. 在SpringBoot 框架中读取配置的方式变得非常多样,这导致读者在搜寻资料时反而容易迷糊. 到底,SpringB ...
- [非专业翻译] 高性能对象映射框架 - Mapster
[非专业翻译] 高性能对象映射框架 - Mapster 系列介绍 [非专业翻译] 是对没有中文文档进行翻译的系列博客,文章由机翻和译者自己理解构成,和原文相比有所有不通,但意思基本一致. 因个人能力有 ...
- 性能工具之linux三剑客awk、grep、sed详解
前言 linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, he ...
- C#《大话设计模式》之模板方法模式学习笔记
static void Main(string[] args) { Console.WriteLine("学生甲抄的试卷:"); TestPaper A = new TestPap ...
- Visual Studio 2010下ASPX页面的TreeView控件循环遍历
如果维护一个老系统就总会遇到各种问题,而这次是TreeView的循环遍历.对于Visual Studio2010上aspx页面的TreeView控件,我感受到了什么叫集微软之大智慧.与二叉树型不一样. ...
- Linux常见信号介绍
1.信号 首先信号我们要和信号量区分开来,虽然两者都是操作系统进程通信的方式.可以简单的理解,信号是用来通知进程发生了什么需要做什么,信号量一般是用作进程同步(pv操作) 2.常见信号量 (以下数字标 ...
- 你的电脑适合升级 Win11 吗?「GitHub 热点速览 v.21.26」
作者:HelloGitHub-小鱼干 WhyNotWin11 是个有意思的项目,本以为是从 360 度"抨击" Windows 11 的不好用之处,但它是一个实实在在地从硬件角度告 ...
- c#在类中使用session
先要继承页面的System.Web.UI.Page using System; using System.Collections.Generic; using System.Linq; using S ...