Spring Boot中findAll填充stores缓存后findById未命中问题咨询
Spring Boot @Cacheable 缓存未命中问题根因
核心逻辑误解
@Cacheable注解的缓存条目唯一标识为 缓存名 + 缓存key,仅缓存名相同不会触发缓存命中,你遇到的问题本质是两个方法的缓存key不匹配、缓存内容无法自动复用。
具体原因
- 默认缓存key生成规则不匹配
Spring默认使用SimpleKeyGenerator生成缓存key,规则为方法名 + 入参列表:- 无参方法
findAllStores生成的key为SimpleKey [],对应缓存值是完整的List<Store>集合 - 带参方法
findById生成的key为SimpleKey [传入的storeId值],和全量查询的key完全不同,因此不会命中缓存,仍会执行5秒休眠+数据库查询逻辑
- 无参方法
- 缓存内容不会自动拆解映射
全量查询的缓存值是一整个列表对象,Spring Cache不会自动将列表中的元素拆解为storeId -> Store的独立键值对存入同一个缓存名下面。全量查询的缓存条目和单id查询的缓存条目完全独立,没有关联关系,无法互相复用。
可选优化方案(补充)
如果要实现预期的缓存复用效果,可以在全量查询执行后,手动遍历列表将单个Store对象按id为key写入stores缓存中,后续单id查询就可以直接命中。
内容的提问来源于stack exchange,提问作者Oirampok
相关产品推荐
相关产品推荐

