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

摘要:本文将介绍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>

2. 创建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();

3.缓存操作:

// 添加缓存项
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();

2. 基于权重的回收:

Cache<String, Object> cache = Caffeine.newBuilder()
        .maximumWeight(1000)
        .weigher((key, value) -> value.length())
        .build();

3. 基于时间的回收:

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();

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值