姿势一

使用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使用的三种姿势的更多相关文章

  1. ASP.NET缓存中Cache过期的三种策略

    原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...

  2. 浅谈OC对象初始化的三种姿势

    一.普通程序猿普通程序员使用最常见路人姿势等场.普普通通,纯属陆仁辈. 陆仁贾写法: // view 1 UIView *v1 = [UIView alloc] initWithFrame:CGRec ...

  3. Django之session验证的三种姿势

    一.什么是session session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中. 二.FVB中 ...

  4. go 中解析JSON的三种姿势

    背景 这是一篇写给0-1年新人的文章,短平快的教会你如何解析json字符串. 示例Json 假设有如下json字符串: { "userName":"admin" ...

  5. 正确开启Mockjs的三种姿势:入门参考(一)

    一.文章初衷 阅读本文章需要注意以下几点: 文章不主要介绍Mockjs的使用语法 文章暂不涉及Mockjs的第三方封装框架 文章会结合以往做过上线项目的方式总结 想主要介绍如何使用Mockjs,是因为 ...

  6. 理解Promise的三种姿势

    译者按: 对于Promise,也许你会用了,却并不理解:也许你理解了,却只可意会不可言传.这篇博客将从3个简单的视角理解Promise,应该对你有所帮助. 原文: Three ways of unde ...

  7. Guava Cache源码解析

    概述: 本次主要是分析cache的源码,基本概念官方简介即可. 基本类图: 在官方的文档说明中,Guava Cache实现了三种加载缓存的方式: LoadingCache在构建缓存的时候,使用buil ...

  8. guava cache使用和源码分析

    guava cache的优点和使用场景,用来判断业务中是否适合使用此缓存 介绍常用的方法,并给出示例,作为使用的参考 深入解读源码. guava简介 guava cache是一个本地缓存.有以下优点: ...

  9. Guava cache功能简介(转)

    原文链接:http://ifeve.com/google-guava-cachesexplained/ 范例 LoadingCache<Key, Graph> graphs = Cache ...

随机推荐

  1. 适用于AMD ROC GPU的Numba概述

    适用于AMD ROC GPU的Numba概述 Numba通过按照HSA执行模型将Python代码的受限子集直接编译到HSA内核和设备功能中,从而支持AMD ROC GPU编程.用Numba编写的内核似 ...

  2. 使用现代C++如何避免bugs(上)

    使用现代C++如何避免bugs(上) How to avoid bugs using modern C++ C++的主要问题之一是拥有大量的构造,它们的行为是未定义的,或者程序员只是意想不到的.在各种 ...

  3. 利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理

    利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理 Optimizing and Accelerating AI Inference with the TensorRT Contai ...

  4. 激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊

    激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊 Lidar vs Radar: pros and cons for autonomous driving 新型无人驾驶汽车的数量在缓慢增加,各 ...

  5. 【NX二次开发】三点画圆,三角形外心,已知三点求圆心

    已知P1.P2.P3,求点O 算法:三点不在一条直线上时,通过连接任意两点,作中垂线.任意两条中垂线的交点是圆心.

  6. centos7安装JDK、CentOS

    1.安装JDK 1.1查看系统是否已有自带的JDK rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 1.2卸载已有安装 如果没有输出信息, ...

  7. Golang写文件的坑

    Golang写文件一般使用os.OpenFile返回文件指针的Write方法或者WriteString或者WriteAt方法,但是在使用这三个方法时候经常会遇到写入的内容和实际内容有出入,因为这几个函 ...

  8. Redisson 分布式锁源码 01:可重入锁加锁

    前言 相信小伙伴都是使用分布式服务,那一定绕不开分布式服务中数据并发更新问题! 单系统很容易想到 Java 的各种锁,像 synchronize.ReentrantLock 等等等,那分布式系统如何处 ...

  9. 从 html 实现一个 react🎅

    前言 我们认为,React 是用 JavaScript 构建快速响应的大型 Web 应用程序的首选方式.它在 Facebook 和 Instagram 上表现优秀.官网地址 react 的理念是在于对 ...

  10. Linux下实现MySQL数据库定时备份

    咳~ 咳~ 为了避免数据操作失误.数据丢失.甚至删库跑路,简单做个数据备份吧 1.创建备份目录 # 习惯放在 local 下 cd /usr/local/ # 创建备份目录 mkdir backup ...