基于springboot使用Caffeine

Caffeine 是一个基于 Java 的高性能、现代化的缓存库。它由 Ben Manes 开发,受 Google Guava 缓存库的启发,但具有更好的性能和更多的功能。


Caffeine 的核心特点

  1. 高性能

    • 基于 Java 8 的现代化设计,利用高级并发算法,提供极低的延迟和高吞吐量。
    • 相比于 Guava Cache 和其他缓存库,Caffeine 在性能测试中表现出色。
  2. 灵活的缓存策略

    • 支持多种缓存过期策略:
      • 基于时间的过期(expireAfterWriteexpireAfterAccess)。
      • 基于大小的自动清除(maximumSizemaximumWeight)。
    • 支持基于权重的缓存淘汰(需要自定义权重计算函数)。
  3. 自适应淘汰策略

    • 使用 Window TinyLFU 算法,该算法结合了频率和最近使用(LRU 和 LFU)的优点,能够更高效地淘汰缓存项。
  4. 强大的异步支持

    • 提供异步缓存接口,可以异步加载缓存数据(Caffeine.asyncCache)。
    • 特别适合高并发场景。
  5. 完全可定制

    • 提供丰富的 API,可根据需求灵活配置缓存行为。
    • 支持监听器功能,可以监控缓存的命中率、缓存项的添加和移除。
  6. 与 Spring 的良好集成

    • Caffeine 可以通过 spring-boot-starter-cache 与 Spring Cache 机制无缝集成,作为 Spring 的缓存提供者。

Caffeine 的基本用法

引入依赖

Maven:

xml 复制代码
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.1.8</version>
</dependency>

Gradle:

gradle 复制代码
implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'
创建缓存

同步缓存示例

java 复制代码
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

import java.util.concurrent.TimeUnit;

public class CaffeineExample {
    public static void main(String[] args) {
        // 配置缓存
        Cache<String, String> cache = Caffeine.newBuilder()
                .maximumSize(100) // 最大条目数
                .expireAfterWrite(10, TimeUnit.MINUTES) // 写入后10分钟过期
                .build();

        // 使用缓存
        cache.put("key1", "value1");
        String value = cache.getIfPresent("key1"); // 获取缓存项
        System.out.println(value); // 输出: value1
    }
}

异步缓存示例

java 复制代码
import com.github.benmanes.caffeine.cache.AsyncCache;
import com.github.benmanes.caffeine.cache.Caffeine;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class AsyncCaffeineExample {
    public static void main(String[] args) {
        // 配置异步缓存
        AsyncCache<String, String> asyncCache = Caffeine.newBuilder()
                .maximumSize(100)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .buildAsync();

        // 异步加载
        asyncCache.get("key1", key -> fetchFromDatabase(key)).thenAccept(value -> {
            System.out.println("Loaded value: " + value);
        });
    }

    // 模拟从数据库加载
    private static String fetchFromDatabase(String key) {
        return "FetchedValueFor-" + key;
    }
}

常用 API

  1. 缓存大小和权重限制

    java 复制代码
    Caffeine.newBuilder()
            .maximumSize(500)  // 最大缓存条目数
            .maximumWeight(1000) // 最大缓存权重(需指定权重函数)
            .weigher((key, value) -> value.toString().length()) // 权重函数
            .build();
  2. 缓存过期策略

    • 按时间过期:

      java 复制代码
      Caffeine.newBuilder()
              .expireAfterWrite(10, TimeUnit.MINUTES) // 写入后10分钟过期
              .expireAfterAccess(5, TimeUnit.MINUTES) // 访问后5分钟过期
              .build();
    • 自定义过期:

      java 复制代码
      Caffeine.newBuilder()
              .expireAfter(new Expiry<String, String>() {
                  @Override
                  public long expireAfterCreate(String key, String value, long currentTime) {
                      return TimeUnit.MINUTES.toNanos(10); // 10分钟后过期
                  }
      
                  @Override
                  public long expireAfterUpdate(String key, String value, long currentTime, long currentDuration) {
                      return currentDuration; // 不更新过期时间
                  }
      
                  @Override
                  public long expireAfterRead(String key, String value, long currentTime, long currentDuration) {
                      return currentDuration; // 不更新过期时间
                  }
              })
              .build();
  3. 统计信息

    启用缓存统计,便于监控缓存命中率和性能:

    java 复制代码
    Cache<String, String> cache = Caffeine.newBuilder()
            .maximumSize(100)
            .recordStats() // 启用统计
            .build();
    
    System.out.println(cache.stats()); // 打印统计信息
  4. 监听器

    注册监听器以捕获缓存项的添加、更新和移除事件:

    java 复制代码
    Caffeine.newBuilder()
            .maximumSize(100)
            .removalListener((key, value, cause) ->
                System.out.printf("Key %s removed due to %s%n", key, cause))
            .build();

适用场景

  • API 调用结果缓存:减少重复的网络或服务调用。
  • 数据查询缓存:缓存数据库查询结果,提升查询性能。
  • 会话数据缓存:在用户访问期间缓存会话相关的数据。
  • 实时性要求较高的应用:需要高效、低延迟的缓存系统。

与其他缓存库的比较

特性 Caffeine Guava Cache Ehcache Redis
本地缓存
分布式缓存
性能(低延迟) 非常高 中等 中等 取决于网络
灵活性 中等
异步支持

总结

Caffeine 是一个高性能的本地缓存库,具有灵活的配置和优秀的性能表现,非常适合需要高效缓存的 Java 应用场景。如果你需要一个轻量级、高效的缓存解决方案,Caffeine 是一个绝佳的选择。

相关推荐
慧一居士19 分钟前
ThreadLocal 功能及使用场景介绍,使用详解
java
zh731437 分钟前
typephp的编译核心phpx原理解析
android·java·开发语言
2401_894915533 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
suaizai_4 小时前
Fastjson高危漏洞紧急修复指南
spring boot
Java牛马7 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌7 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
SomeB1oody7 小时前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
东小西8 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
Profile排查笔记8 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
用户938515635078 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js