3. 缓存抽象
与 Spring 和 Grails 类似,Micronaut 在 io.Micronaut.cache 包中提供了一组缓存注解。
CacheManager 接口允许根据需要插入不同的缓存实现。
SyncCache 接口提供用于缓存的同步 API,而 AsyncCache API 允许非阻塞操作
缓存注解
支持以下缓存注解:
- @Cacheable——表示方法在给定的缓存名称内是可缓存的
- @CachePut——指示应该缓存方法调用的返回值。与@Cacheable不同的是,从未跳过原始操作。
- @CacheInvalidate——指示方法的调用应导致一个或多个缓存失效。
通过使用其中一个注解,CacheInterceptor 被激活,在 @Cacheable
的情况下,它将缓存方法的返回结果。
如果方法的返回类型是非阻塞类型(CompletableFuture 或 Publisher 的实例),则将缓存发出的结果。
此外,如果底层缓存实现支持非阻塞缓存操作,则将在不阻塞的情况下从缓存中读取缓存值,从而能够实现完全非阻塞的缓存操作。
使用 Caffeine 缓存
要使用 Caffeine 进行缓存,请在应用程序中添加以下依赖项:
- Gradle
- Maven
implementation("io.micronaut.cache:micronaut-cache-caffeine")
<dependency>
<groupId>io.micronaut.cache</groupId>
<artifactId>micronaut-cache-caffeine</artifactId>
</dependency>
然后配置一个或多个缓存。例如 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,则将使用默认实现。