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

