You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中使用Redis缓存返回Map类型方法的配置问题求助

解决Quarkus Redis缓存Map类型方法的配置问题

一、修复缓存配置不生效的核心问题

你的配置与缓存注解缓存名不匹配是导致缓存失效的直接原因:

  • 注解中使用的缓存名是ATTACHMENTS_CACHE_NAME
  • 但application.properties里配置的是attribute-cache前缀对应yourCacheName

必须让两者完全对应,以下是正确配置示例(假设ATTACHMENTS_CACHE_NAME常量值为attachments-cache):

# 缓存名要和注解里的cacheName严格一致
quarkus.cache.redis.attachments-cache.cache-name=attachments-cache
quarkus.cache.redis.attachments-cache.expire-after-access=96H
# Map类型需分别指定键和值的具体类型,无需直接写完整泛型声明
quarkus.cache.redis.attachments-cache.key-type=java.lang.String
quarkus.cache.redis.attachments-cache.value-type=your.package.PlanAttrUnified

Redis缓存会自动序列化整个Map结构,只需明确Map内部键值的具体类型即可(键类型默认是String,也可显式指定)。

二、修正泛型方法的缓存注解使用

你的方法是泛型方法,需确保@CacheKey标记的参数能被正确序列化作为缓存键:

  • 确保BaseTaskEntity及其子类实现Serializable接口(Redis缓存要求键可序列化)
  • 如果整个实体作为键存在序列化问题,可提取实体的唯一标识字段作为缓存键,示例:
@CacheResult(cacheName = ATTACHMENTS_CACHE_NAME)
public <T extends BaseTaskEntity> Map<String, PlanAttrUnified> fetchAllPlanAttr(
        @CacheKey("id") T baseTask, boolean raiseError) {
    // 方法逻辑
}

三、解决"detailed-panel-jobcards"缓存类型未配置的残留错误

  1. 清理Quarkus构建缓存:执行命令清除旧构建残留:
# Maven项目
./mvnw clean -Dquarkus.clean.all
# Gradle项目
./gradlew clean
  1. 全面检查代码与配置:全局搜索项目中是否还有detailed-panel-jobcards的引用,包括:
    • 所有@CacheResult、@CacheInvalidate、@CachePut注解
    • 各环境配置文件(如application-dev.properties)
    • 常量类中定义的缓存名字符串

四、验证缓存生效的步骤

添加调试日志配置,查看缓存触发情况:

quarkus.log.category."io.quarkus.cache".level=DEBUG
quarkus.log.category."io.quarkus.redis".level=DEBUG

调用fetchAllPlanAttr方法后,检查日志中是否出现Cache hit或Cache miss的输出,确认缓存逻辑正常触发。

内容的提问来源于stack exchange,提问作者Mali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:53:15