You need to enable JavaScript to run this app. Spring Boot中findAll填充stores缓存后findById未命中问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中findAll填充stores缓存后findById未命中问题咨询

Spring Boot @Cacheable 缓存未命中问题根因

核心逻辑误解

@Cacheable注解的缓存条目唯一标识为 缓存名 + 缓存key,仅缓存名相同不会触发缓存命中,你遇到的问题本质是两个方法的缓存key不匹配、缓存内容无法自动复用。

具体原因

  • 默认缓存key生成规则不匹配
    Spring默认使用SimpleKeyGenerator生成缓存key,规则为方法名 + 入参列表:
    1. 无参方法findAllStores生成的key为SimpleKey [],对应缓存值是完整的List<Store>集合
    2. 带参方法findById生成的key为SimpleKey [传入的storeId值],和全量查询的key完全不同,因此不会命中缓存,仍会执行5秒休眠+数据库查询逻辑
  • 缓存内容不会自动拆解映射
    全量查询的缓存值是一整个列表对象,Spring Cache不会自动将列表中的元素拆解为storeId -> Store的独立键值对存入同一个缓存名下面。全量查询的缓存条目和单id查询的缓存条目完全独立,没有关联关系,无法互相复用。

可选优化方案(补充)

如果要实现预期的缓存复用效果,可以在全量查询执行后,手动遍历列表将单个Store对象按id为key写入stores缓存中,后续单id查询就可以直接命中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 16:27:03