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

Spring Boot @Cacheable多参数Key配置问题:缓存静态列表未生效

问题分析与解决方案

首先,你当前的实现存在冗余,但逻辑本身可以工作,不过更简洁且易维护的写法是直接使用单个@Cacheable注解,无需借助@Caching组合多个注解:

@Cacheable(
    value = "lists_",
    key = "{#a, #b}",
    condition = "#b == 'states' || #b == 'programs'"
)
public ResponseBody<List<String>> getStaticLists(String a, String b, HttpHeaders headers) {
    // 实现代码
}

这种写法完全匹配你的需求:仅当参数b为states或programs时,以{a, b}作为唯一key缓存结果,不同的a和b组合会生成独立的缓存条目,自然实现“针对参数a的每种类型,分别缓存states和programs”的目标。

原写法的问题

你用@Caching组合两个@Cacheable的写法属于冗余操作:Spring每次调用方法时都会检查两个缓存规则,但最终效果和单个注解加或条件完全一致,只会增加不必要的规则校验开销。

未达预期的可能原因

如果简化后仍不生效,大概率不是注解写法的问题,建议排查以下几点:

  • 缓存配置错误:检查缓存管理器(如默认的ConcurrentMapCacheManager)是否正确初始化,缓存名称lists_是否配置无误。
  • Key生成异常:开启Spring缓存调试日志(logging.level.org.springframework.cache=DEBUG),查看实际生成的缓存key是否符合预期,确认{#a, #b}是否正确拼接了a和b的值。
  • 序列化问题:如果使用Redis等依赖序列化的缓存,确保ResponseBody类实现了Serializable接口,否则无法正常缓存和读取。
  • 参数匹配问题:确认调用方法时传入的b参数大小写、拼写完全符合预期(比如是否误传States而非states)。

是否需要自定义Key生成器?

不需要。你当前使用的SpEL表达式{#a, #b}已经可以生成唯一的缓存key,完全满足需求。只有当默认key生成规则无法应对复杂的参数组合逻辑时,才需要自定义KeyGenerator。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:45:08