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
相关产品推荐
相关产品推荐

