跳到主要内容

3. 缓存抽象

与 Spring 和 Grails 类似,Micronaut 在 io.Micronaut.cache 包中提供了一组缓存注解。

CacheManager 接口允许根据需要插入不同的缓存实现。

SyncCache 接口提供用于缓存的同步 API,而 AsyncCache API 允许非阻塞操作

缓存注解

支持以下缓存注解:

  • @Cacheable——表示方法在给定的缓存名称内是可缓存的
  • @CachePut——指示应该缓存方法调用的返回值。与@Cacheable不同的是,从未跳过原始操作。
  • @CacheInvalidate——指示方法的调用应导致一个或多个缓存失效。

通过使用其中一个注解,CacheInterceptor 被激活,在 @Cacheable 的情况下,它将缓存方法的返回结果。

如果方法的返回类型是非阻塞类型(CompletableFuturePublisher 的实例),则将缓存发出的结果。

此外,如果底层缓存实现支持非阻塞缓存操作,则将在不阻塞的情况下从缓存中读取缓存值,从而能够实现完全非阻塞的缓存操作。

使用 Caffeine 缓存

要使用 Caffeine 进行缓存,请在应用程序中添加以下依赖项:

implementation("io.micronaut.cache:micronaut-cache-caffeine")

然后配置一个或多个缓存。例如 application.yml

缓存配置示例

micronaut:
caches:
my-cache:
maximumSize: 20

上面的例子将配置一个名为“my-cache”的缓存,最大大小为 20。

micronaut:
caches:
my-cache:
listen-to-removals: true
listen-to-evictions: true

这个例子是一个带有删除/驱逐侦听器的缓存。为了能够使用它们,只需实现 com.github.benmanes.caffeine.cache.RemovalListener 接口,如示例所示。

@Singleton
public class RemovalListenerImpl implements RemovalListener<K, V> {

@Override
public void onRemoval(
@Nullable K key,
@Nullable V value,
@NonNull RemovalCause cause
) {
}
}
注意

命名缓存

micronaut.caches 下的缓存名称应以烤串风格(小写和连字符分隔)定义,如果使用驼峰风格,则名称将标准化为烤串风格。例如,指定 myCache 将成为 my-cache。引用 @Cacheable 注解中的缓存时,应使用烤串风格。

要将权重配置为与 maximumWeight 配置一起使用,请创建一个实现 com.github.benmanes.caffeine.cache.weigher 的 bean。要将给定的秤仅与特定的缓存关联,请使用 @Named(<cache name>) 注解 bean。没有命名限定符的权重将应用于所有没有命名权重的缓存。如果没有找到 bean,则将使用默认实现。

英文链接