锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Caffeine 缓存:快速上手与Spring Boot集成指南

Caffeine 缓存:快速上手与Spring Boot集成指南

0
  • JAVA
  • 发布于 2024-08-15
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

摘要:本文将介绍 Caffeine 缓存库,概述其背景、优点、缺点,并详细说明如何在 Java 项目中使用 Caffeine,以及如何将其与 Spring Boot 框架集成。最后,我们将通过一个简单的例子来演示 Caffeine 缓存的使用。

一、Caffeine 缓存背景

Caffeine 是一个高性能、可扩展的 Java 缓存库,由 Google 的 Ben Manes 开发。Caffeine 基于 ConcurrentHashMap 设计,采用了近似 LRU(Least Recently Used,最近最少使用)算法,以实现高速缓存淘汰策略。Caffeine 广泛应用于各类 Java 项目中,作为一种提高数据读取性能的优秀解决方案。

二、Caffeine 缓存优点与缺点

优点:

  1. 高性能:Caffeine 性能优于许多其他缓存库,因其采用了近似 LRU 算法,实现了高效的缓存淘汰策略。
  2. 灵活性:Caffeine 提供了丰富的配置选项,用户可根据项目需求灵活定制缓存策略。
  3. 易集成:Caffeine 可轻松与 Spring Boot 框架集成,实现便捷的缓存管理。
  4. 易于使用:Caffeine API 简洁易懂,便于开发者快速上手。

缺点:

  1. 仅支持 Java:Caffeine 为 Java 特有的缓存库,不能直接应用于其他编程语言。
  2. 近似 LRU 算法:虽然 Caffeine 采用了高效的近似 LRU 算法,但在某些场景下,其性能可能不如精确的 LRU 算法。

三、Caffeine 缓存基本使用方法

  1. 添加 Caffeine 依赖:
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.9.2</version>
</dependency>
  1. 创建 Caffeine 缓存实例:
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
 
Cache<String, Object> cache = Caffeine.newBuilder()
        .maximumSize(100)
        .expireAfterWrite(5, TimeUnit.MINUTES)
        .build();
  1. 缓存操作:
// 添加缓存项
cache.put("key", "value");
 
// 获取缓存项
Object value = cache.getIfPresent("key");
 
// 删除缓存项
cache.invalidate("key");

 四、Spring Boot 集成与配置

  1. 添加依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
     
    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>2.9.2</version>
    </dependency>
    
  2. 在 Spring Boot 主类上添加 @EnableCaching 注解:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
     
    @SpringBootApplication
    @EnableCaching
    public class CaffeineDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(CaffeineDemoApplication.class, args);
        }
    }
    
  3. 在 application.properties 文件中配置 Caffeine 缓存:

    spring.cache.type=caffeine
    spring.cache.caffeine.spec=maximumSize=100,expireAfterWrite=300s
    
  4. 在需要使用缓存的方法上添加 @Cacheable 注解:

    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
     
    @Service
    public class DataService {
        
        @Cacheable(value = "data", key = "#id")
        public Data getData(Long id) {
            // 模拟从数据库或其他来源获取数据
            return new Data(id, "sample data");
        }
    }
    

    五、示例

    假设我们有一个简单的数据服务,需要根据 ID 从数据库中获取数据。为了提高性能,我们可以使用 Caffeine 缓存:

  • 创建数据实体:
public class Data {
    private Long id;
    private String content;
 
    public Data(Long id, String content) {
        this.id = id;
        this.content = content;
    }
 
    // 省略getter和setter方法
}
  • 使用 Caffeine 缓存实现数据服务:
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
 
@Service
public class DataService {
    
    private final Cache<Long, Data> cache = Caffeine.newBuilder()
            .maximumSize(100)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .build();
 
    public Data getData(Long id) {
        return cache.get(id, this::loadDataFromDatabase);
    }
 
    private Data loadDataFromDatabase(Long id) {
        // 模拟从数据库获取数据
        return new Data(id, "sample data");
    }
}

        当调用 getData 方法时,Caffeine 缓存会首先检查缓存中是否存在对应的数据,若存在则直接返回,否则从数据库中加载数据,并将其添加到缓存中。这样,我们就实现了一个简单的基于 Caffeine 的数据缓存服务。

        Caffeine 还提供了许多其他功能,如:缓存回收策略、监听器、统计信息等。以下是一些补充内容:

六、Caffeine 缓存回收策略

Caffeine 提供了多种回收策略,可根据需求灵活配置:

  1. 基于大小的回收:
Cache<String, Object> cache = Caffeine.newBuilder()
        .maximumSize(100)
        .build();
  1. 基于权重的回收:
Cache<String, Object> cache = Caffeine.newBuilder()
        .maximumWeight(1000)
        .weigher((key, value) -> value.length())
        .build();
  1. 基于时间的回收:
Cache<String, Object> cache = Caffeine.newBuilder()
        .expireAfterWrite(5, TimeUnit.MINUTES)
        .build();

七、Caffeine 缓存监听器

Caffeine 支持添加监听器,以便在缓存项被移除时执行特定操作:

Cache<String, Object> cache = Caffeine.newBuilder()
        .maximumSize(100)
        .removalListener((key, value, cause) -> {
            System.out.println("Removed key: " + key + ", cause: " + cause);
        })
        .build();

八、Caffeine 缓存统计信息

Caffeine 提供了统计信息,方便查看缓存性能指标:

Cache<String, Object> cache = Caffeine.newBuilder()
        .maximumSize(100)
        .recordStats()
        .build();
 
// 获取统计信息
com.github.benmanes.caffeine.cache.stats.CacheStats stats = cache.stats();
标签: #软件开发 1171 #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.