Micronaut @Cacheable注解的TTL、保留策略及缓存存储问题咨询
Micronaut @Cacheable 相关问题解答
先看你使用的@Cacheable注解代码:
@Retryable(attempts = "5", delay = "20ms", multiplier = "2.0") @Cacheable(value = ["my-cache"], parameters = ["id"]) @Get("/fetch/mydata") fun fetchData() { ....required confs for calling the api }
针对你的三个问题,解答如下:
1. 默认TTL是多少?
Micronaut的@Cacheable注解本身没有预设TTL(存活时间),如果不手动配置过期规则,缓存项会一直保留在存储介质中,直到被手动清除,或者缓存存储达到容量上限触发淘汰策略。
若需要设置TTL,可在应用配置文件(如application.yml)中针对指定缓存进行配置,示例:
micronaut: caches: my-cache: expire-after-write: 5m
2. SOURCE、CLASS、RUNTIME 保留策略枚举的含义
这三个是注解的保留策略,决定注解在代码生命周期中的存在阶段:
- SOURCE:注解仅存在于源代码中,编译成字节码时会被丢弃,不会进入class文件。多用于编译期校验、代码生成等场景,无法在运行时通过反射读取。
- CLASS:注解会被保留到class文件中,但JVM加载类时不会将其载入运行时环境,这是注解的默认保留策略。通常用于字节码增强类的操作。
- RUNTIME:注解会一直保留到运行时,JVM加载类后可通过反射机制读取注解信息。像
@Cacheable这类需要在运行时生效的注解,就采用这个保留策略。
3. 缓存项存储在何处?
默认情况下,Micronaut使用JVM堆内存作为缓存存储介质,底层基于ConcurrentHashMap实现,缓存数据直接存在当前应用进程的堆内存中。
如果配置了第三方缓存实现(如Caffeine、Redis、Hazelcast等),缓存项会存储到对应的介质中:
- Caffeine:本地堆内存缓存(比默认实现更高效,支持更多淘汰策略)
- Redis:远程Redis服务器
- Hazelcast:分布式内存集群
内容的提问来源于stack exchange,提问作者Mohamed Niyaz
相关产品推荐
相关产品推荐

