本地缓存Caffeine简介与使用

986 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

Caffeine是一种开源的Java缓存库,提供了一种灵活的缓存策略和高性能的缓存功能。其可以用于本地缓存,分布式系统的话还是需要OSS或者Redis等分布式存储。

Caffeine和Guava的区别

Caffeine和Guava都是Google开源的缓存库,二者有以下区别:

  1. 目的不同

Guava的Cache主要是为了解决应用程序内部的缓存问题,而Caffeine则更侧重于为高性能应用程序提供本地缓存的解决方案。

  1. API设计不同

Guava的Cache API非常灵活,支持许多配置和特性,包括缓存项的过期时间、大小限制、回收策略等等。Caffeine的API则更加简单和易用,提供了默认的缓存行为,并尽可能地减少配置项。

  1. 数据结构不同

Guava的Cache实现使用的是基于链表和哈希表的手写数据结构,而Caffeine则使用了基于链表和哈希表的自定义数据结构。Caffeine的数据结构相对于Guava更加高效,特别是在高并发情况下。

  1. 支持的Java版本不同

Guava支持的最低Java版本是Java 6,而Caffeine支持的最低Java版本是Java 8。

  1. 支持的功能不同

虽然两者都支持缓存的基本功能,如设置过期时间、最大缓存大小等,但Caffeine提供了一些Guava中没有的高级功能,如异步加载、手动缓存项清理、缓存项的可观察性等。

总体来说,Caffeine相对于Guava具有更高的性能和更简单的API设计,而Guava则更加灵活和功能更全面。

Caffeine的简单使用

下面是在本地缓存中使用Caffeine的方法:

  1. 引入依赖

在项目的Maven或Gradle配置文件中添加以下依赖项:

Maven:

<dependency>
  <groupId>com.github.ben-manes.caffeine</groupId>
  <artifactId>caffeine</artifactId>
  <version>3.1.2</version>
</dependency>

Gradle:

dependencies {
    implementation 'com.github.ben-manes.caffeine:caffeine:3.1.2'
}

  1. 创建Caffeine缓存

可以使用Caffeine类的静态方法来创建缓存,例如:

LoadingCache<String, String> cache = Caffeine.newBuilder()
        .maximumSize(100)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .build(
            new CacheLoader<String, String>() {
                public String load(String key) throws Exception {
                    return "value";
                }
            });

上面的代码创建了一个最大容量为100的缓存,缓存项会在写入后10分钟过期。这个缓存也是一个LoadingCache,这意味着当缓存中没有请求的数据时,它将调用CacheLoaderload方法来加载缓存项。

  1. 向缓存中添加数据

可以使用put方法向缓存中添加数据,例如:

cache.put("key1", "value1");
  1. 从缓存中获取数据

可以使用get方法从缓存中获取数据,例如:

String value = cache.get("key1");

如果缓存中没有该键的值,则会调用CacheLoaderload方法来加载缓存项。

  1. 删除缓存中的数据

可以使用invalidate方法来删除缓存中的数据,例如:

cache.invalidate("key1");
  1. 缓存清理

可以使用cleanUp方法来清理缓存中的过期或无用项,例如:

cache.cleanUp();

这将清除缓存中的所有过期和无用项。

以上就是在本地缓存中使用Caffeine的方法,推荐对上述方法再进行一层封装而非直接调用,以免直接暴露操作层。除了上述方法,Caffeine还提供了更多的高级功能,例如异步加载、缓存监听器等,可以根据需要进行使用。

SpringBoot+Caffeine

在Spring Boot框架中,可以使用@Cacheable@CachePut@CacheEvict等注解来实现缓存功能,并且可以很方便地与Caffeine缓存库集成。

例如,要在上述缓存中的键值对失效时调用Mapper类的方法,可以使用@CacheEvict注解。具体步骤如下:

  1. 引入依赖

除了上述的Caffeine依赖之外,还需要在Maven或Gradle配置文件中添加Spring Boot的缓存依赖:

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

Gradle:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-cache'
}
  1. 配置Caffeine缓存

在Spring Boot中,可以在application.propertiesapplication.yml配置文件中配置缓存的相关参数。例如,以下配置使用Caffeine作为缓存提供程序,并设置缓存的最大大小为100,超时时间为60秒:

application.yml:

spring:
  cache:
    caffeine:
      spec: maximumSize=100,expireAfterWrite=60s
  1. 在Mapper类中添加缓存注解

在Mapper类的方法上添加@CacheEvict注解,该注解可以指定需要清除的缓存项的名称和条件。例如,以下代码清除名称为myCache的缓存中所有以"find"开头的键值对:

@Mapper
@CacheConfig(cacheNames = "myCache")
public interface MyMapper {
    
    @CacheEvict(key = "'find:' + #p0 + '*'")
    List<User> findUsersByUsername(String username);
}

在上述代码中,@CacheConfig注解指定了缓存名称为myCache@CacheEvict注解指定了需要清除的键值对的条件,其中#p0表示方法的第一个参数,'*'表示匹配任意字符。

  1. 启用缓存功能

在Spring Boot中,需要在启动类上添加@EnableCaching注解,以启用缓存功能。例如:

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

通过以上步骤,就可以在Caffeine缓存中设置失效时间,并在失效时调用Mapper类的方法来更新缓存。