开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
Caffeine是一种开源的Java缓存库,提供了一种灵活的缓存策略和高性能的缓存功能。其可以用于本地缓存,分布式系统的话还是需要OSS或者Redis等分布式存储。
Caffeine和Guava的区别
Caffeine和Guava都是Google开源的缓存库,二者有以下区别:
- 目的不同
Guava的Cache主要是为了解决应用程序内部的缓存问题,而Caffeine则更侧重于为高性能应用程序提供本地缓存的解决方案。
- API设计不同
Guava的Cache API非常灵活,支持许多配置和特性,包括缓存项的过期时间、大小限制、回收策略等等。Caffeine的API则更加简单和易用,提供了默认的缓存行为,并尽可能地减少配置项。
- 数据结构不同
Guava的Cache实现使用的是基于链表和哈希表的手写数据结构,而Caffeine则使用了基于链表和哈希表的自定义数据结构。Caffeine的数据结构相对于Guava更加高效,特别是在高并发情况下。
- 支持的Java版本不同
Guava支持的最低Java版本是Java 6,而Caffeine支持的最低Java版本是Java 8。
- 支持的功能不同
虽然两者都支持缓存的基本功能,如设置过期时间、最大缓存大小等,但Caffeine提供了一些Guava中没有的高级功能,如异步加载、手动缓存项清理、缓存项的可观察性等。
总体来说,Caffeine相对于Guava具有更高的性能和更简单的API设计,而Guava则更加灵活和功能更全面。
Caffeine的简单使用
下面是在本地缓存中使用Caffeine的方法:
- 引入依赖
在项目的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'
}
- 创建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,这意味着当缓存中没有请求的数据时,它将调用CacheLoader的load方法来加载缓存项。
- 向缓存中添加数据
可以使用put方法向缓存中添加数据,例如:
cache.put("key1", "value1");
- 从缓存中获取数据
可以使用get方法从缓存中获取数据,例如:
String value = cache.get("key1");
如果缓存中没有该键的值,则会调用CacheLoader的load方法来加载缓存项。
- 删除缓存中的数据
可以使用invalidate方法来删除缓存中的数据,例如:
cache.invalidate("key1");
- 缓存清理
可以使用cleanUp方法来清理缓存中的过期或无用项,例如:
cache.cleanUp();
这将清除缓存中的所有过期和无用项。
以上就是在本地缓存中使用Caffeine的方法,推荐对上述方法再进行一层封装而非直接调用,以免直接暴露操作层。除了上述方法,Caffeine还提供了更多的高级功能,例如异步加载、缓存监听器等,可以根据需要进行使用。
SpringBoot+Caffeine
在Spring Boot框架中,可以使用@Cacheable、@CachePut、@CacheEvict等注解来实现缓存功能,并且可以很方便地与Caffeine缓存库集成。
例如,要在上述缓存中的键值对失效时调用Mapper类的方法,可以使用@CacheEvict注解。具体步骤如下:
- 引入依赖
除了上述的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'
}
- 配置Caffeine缓存
在Spring Boot中,可以在application.properties或application.yml配置文件中配置缓存的相关参数。例如,以下配置使用Caffeine作为缓存提供程序,并设置缓存的最大大小为100,超时时间为60秒:
application.yml:
spring:
cache:
caffeine:
spec: maximumSize=100,expireAfterWrite=60s
- 在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表示方法的第一个参数,'*'表示匹配任意字符。
- 启用缓存功能
在Spring Boot中,需要在启动类上添加@EnableCaching注解,以启用缓存功能。例如:
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
通过以上步骤,就可以在Caffeine缓存中设置失效时间,并在失效时调用Mapper类的方法来更新缓存。