JVM进程缓存

引言

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

  • 分布式缓存,例如Redis:

    • 优点:存储容量更大、可靠性更好、可以在集群间共享

    • 缺点:访问缓存有网络开销

    • 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享

  • 进程本地缓存,例如HashMap、GuavaCache:

    • 优点:读取本地内存,没有网络开销,速度更快

    • 缺点:存储容量有限、可靠性较低、无法共享

    • 场景:性能要求较高,缓存数据量较小

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

初识Caffeine

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

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

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

基本使用

首先导入依赖:

<dependency>
  <groupId>com.github.ben-manes.caffeine</groupId>
  <artifactId>caffeine</artifactId>
  <version>2.7.0</version>
</dependency>
@Test
void testBasicOps() {
    // 构建cache对象
    Cache<String, String> 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);

    // 删除缓存
    cache.invalidate("gf");
}

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

三种缓存驱逐策略

  • 基于容量:设置缓存的数量上限

    // 创建缓存对象
    Cache<String, String> cache = Caffeine.newBuilder()
        .maximumSize(1) // 设置缓存大小上限为 1
        .build();
  • 基于时间:设置缓存的有效时间

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

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

制作不易,喜欢的可以支持一下,每日都会分享编程知识!

相关推荐

  1. JVM进程缓存 Caffeine

    2023-12-11 10:20:03       8 阅读
  2. jvm一级缓存

    2023-12-11 10:20:03       32 阅读
  3. JVM缓存本地缓存Caffeine

    2023-12-11 10:20:03       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 10:20:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 10:20:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 10:20:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 10:20:03       20 阅读

热门阅读

  1. 正确使用React组件缓存

    2023-12-11 10:20:03       43 阅读
  2. element-ui按钮el-button,点击之后恢复之前的颜色

    2023-12-11 10:20:03       36 阅读
  3. Go Fyne 入门

    2023-12-11 10:20:03       44 阅读
  4. 力扣labuladong——一刷day69

    2023-12-11 10:20:03       37 阅读
  5. GO语言使用OpenCV,图找图

    2023-12-11 10:20:03       34 阅读
  6. pytorch debug 常用工具

    2023-12-11 10:20:03       37 阅读
  7. kafka学习

    2023-12-11 10:20:03       34 阅读
  8. Vscode中配置SSH

    2023-12-11 10:20:03       34 阅读
  9. 力扣375周赛

    2023-12-11 10:20:03       36 阅读
  10. Python高级算法——贪心算法(Greedy Algorithm)

    2023-12-11 10:20:03       37 阅读
  11. MySQL中的数据类型

    2023-12-11 10:20:03       37 阅读
  12. MapReduce

    2023-12-11 10:20:03       24 阅读
  13. 哈顿矩阵:预防伤害的项目管理技术

    2023-12-11 10:20:03       26 阅读