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

使用Spring @Cacheable时能否混合缓存键类型?

Spring缓存:不同参数集作为键共用同一缓存的可行性

完全可以将不同参数集生成的缓存键存储在同一个缓存中,不需要额外创建两个独立缓存。你的示例代码写法是合理的,具体说明如下:

  • 键唯一性是核心前提
    Spring Cache允许通过SpEL表达式自定义缓存键,只要你定义的键能保证不同查询场景下的唯一性,就不会出现缓存冲突。比如第一个方法用{ #itemId, #organizationId }生成复合键,第二个用#itemName作为键,只要业务上能确保这两种键的字符串形式不会重复(比如不会出现某个itemName恰好等于{123, 456}这类情况),就可以安全共用myCache这个缓存空间。

  • 缓存清理逻辑可行
    你用@Caching组合两个@CacheEvict的写法很正确,能分别清理两种键对应的缓存数据,确保数据更新后,两种查询方式都能拿到最新结果,不会出现脏缓存。

当然,如果业务上存在键冲突的风险(比如无法避免itemName和复合键字符串重复),那最好还是创建两个独立缓存(比如myCacheByIdOrg和myCacheByName),彻底规避冲突。但只要能保证键的唯一性,共用缓存完全没问题。

示例代码:

@Cacheable(value="myCache", key="{ #itemId, #organizationId }")
public long getValue(long itemId, long organizationId) { ... }

@Cacheable(value="myCache", key="#itemName")
public long getValue(String itemName) { ... }

@Caching(evict = {
        @CacheEvict(value="myCache", key="{ #itemId, #organizationId }"),
        @CacheEvict(value="myCache", key="#itemName")
})
public void evictValue(long itemId, long organizationId , String itemName) { }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:45:38