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"缓存类型未配置的残留错误
- 清理Quarkus构建缓存:执行命令清除旧构建残留:
# Maven项目 ./mvnw clean -Dquarkus.clean.all # Gradle项目 ./gradlew clean
- 全面检查代码与配置:全局搜索项目中是否还有
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
相关产品推荐
相关产品推荐

