初识Caffeine

初识Caffeine缓存在日常开发中启动至关重要的作用 由于是存储在内存中 数据的读取速度是非常快的 能大量减少对数据库的访问 减少数据库的压力 我们把缓存分为两类 分布式缓存 例如 Redis 优点 存储容量更大 可靠性更好 可以在集群间共享 缺点 访问缓存有网络开销 场景 缓存数据量较大 可靠性要求较高 需要在集群间共享 进程本地缓存 例如 HashMap GuavaCache 优点 读取本地内存 没有网络开销 速度更快 缺点 存储

缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。我们把缓存分为两类:

 

  • 分布式缓存,例如Redis:
    • 优点:存储容量更大、可靠性更好、可以在集群间共享
    • 缺点:访问缓存有网络开销
    • 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享
  • 进程本地缓存,例如HashMap、GuavaCache:
    • 优点:读取本地内存,没有网络开销,速度更快
    • 缺点:存储容量有限、可靠性较低、无法共享
    • 场景:性能要求较高,缓存数据量较小

我们今天会利用Caffeine框架来实现JVM进程缓存。

Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine

Caffeine的性能非常好,下图是官方给出的性能对比:

初识Caffeine

可以看到Caffeine的性能遥遥领先!

缓存使用的基本API:

@Test void testBasicOps() { // 构建cache对象 Cache 
  
    cache = Caffeine.newBuilder().build(); // 存数据 cache.put("gf", "迪丽热巴"); // 取数据 String gf = cache.getIfPresent("gf"); System.out.println("gf = " + gf); // 取数据,包含两个参数: // 参数一:缓存的key // 参数二:Lambda表达式,表达式参数就是缓存的key,方法体是查询数据库的逻辑 // 优先根据key查询JVM缓存,如果未命中,则执行参数二的Lambda表达式 String defaultGF = cache.get("defaultGF", key -> { // 根据key去数据库查询数据 return "柳岩"; }); System.out.println("defaultGF = " + defaultGF); } 
  

Caffeine既然是缓存的一种,肯定需要有缓存的清除策略,不然的话内存总会有耗尽的时候。

Caffeine提供了三种缓存驱逐策略:

  • 基于容量:设置缓存的数量上限
// 创建缓存对象 Cache 
  
    cache = Caffeine.newBuilder() .maximumSize(1) // 设置缓存大小上限为 1 .build(); 
  

基于时间:设置缓存的有效时间

// 创建缓存对象 Cache 
  
    cache = Caffeine.newBuilder() // 设置缓存有效期为 10 秒,从最后一次写入开始计时 .expireAfterWrite(Duration.ofSeconds(10)) .build(); 
  
  • 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。

注意:在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222135.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:30
下一篇 2026年3月17日 下午4:30


相关推荐

  • layer 弹出层传递参数

    layer 弹出层传递参数layer弹出层轻量好用,一直喜欢用,但是却没有弹出层传参的接口,迫于无奈只能Url地址传参,总所周知,这个可是限制大小的,百度一番,看看大神们怎么处理,结果就感觉所有回答都是Ctrl+C加Ctrl+V,全是地址栏传参,页面缓存、cookie、localstorage,本着不甘心的原则,就想为什么不能在open的时候把参数一起作为属性传递了,强行看了layer源码(扒光慢慢看),于是乎…

    2022年7月13日
    15
  • hscan扫描工具

    hscan扫描工具在网上发现一篇关于 hscan 工具的介绍文章来源 http book 51cto com art 200810 94967 htm2 4 3 使用 HScan 获取信息案例 HScan 是一款优秀的扫描软件 它在公开场合出现较少 虽然不如流光 XScan Superscan 出名 但程序移植性好 不需要安装 速度快 提供 HTML 报告和 HScan log 两种扫描结果 HScan 有两个版本

    2026年3月19日
    2
  • Android 开机动画的制作「建议收藏」

    Android 开机动画的制作「建议收藏」最近项目需要对项目Android设备进行开机动画的替换,此项需求操作比较简单,但是也有一些细节需要注意,分享给有需求的极客们开机动画的制作、替换流程。

    2022年5月14日
    57
  • 算术平均、几何平均、调和平均、平方平均和移动平均

    算术平均、几何平均、调和平均、平方平均和移动平均本文内容算术平均 几何平均 调和平均 平方平均 移动平均算术平均 几何平均 调和平均 平方平均和移动平均跟计算编程有什么关系 JustOneWord 不能只会算术平均数 还有其他很多选择 以及不同场景使用不同的平均数 算术平均算术平均 Arithmeticme 是最基本 最常用的一种平均指标 描述数据集中趋势的一个统计指标 计算公式为 即 n 个数据

    2026年3月19日
    3
  • 什么是字节对齐,为什么需要字节对齐

    什么是字节对齐,为什么需要字节对齐概念 在 C 语言中 结构是一种复合数据类型 其构成元素既可以是基本数据类型 如 int long float 等 的变量 也可以是一些复合数据类型 如数组 结构 联合等 的数据单元 在结构中 编译器为结构的每个成员按其自然边界 alignment 分配空间 各个成员按照它们被声明的顺序在内存中顺序存储 第一个成员的地址和整个结构的地址相同 为了使 CPU 能够对变量进行快速的访问 变量的起始地

    2026年3月17日
    2
  • MATLAB优化函数fmincon解析[通俗易懂]

    MATLAB优化函数fmincon解析[通俗易懂]MATLAB,优化函数fmincon解析[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);…

    2022年6月14日
    239

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号