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

Spring Boot如何检查缓存中是否存在对象而不存储新对象

解决方案:仅检查缓存存在性,不自动加载存储

在Spring Cache体系中,默认的@Cacheable注解会在缓存未命中时执行目标方法并将结果存入缓存,这和你的需求不符。你可以通过以下两种方式实现仅检查缓存、不触发业务方法执行也不存储新对象的逻辑:

方法一:直接通过CacheManager手动查询缓存

这是最直接且符合需求的方案,注入Spring的CacheManager后,直接操作缓存实例,完全跳过业务方法的执行:

@Service
public class YourService {
    private final CacheManager cacheManager;
    private final ObjectRepository objectRepository;

    // 构造注入依赖
    public YourService(CacheManager cacheManager, ObjectRepository objectRepository) {
        this.cacheManager = cacheManager;
        this.objectRepository = objectRepository;
    }

    // 原有@Cacheable方法(保留,供需要自动加载的场景使用)
    @Cacheable(cacheNames = "objects", key = "#id")
    public Object findObject(Long id) {
        return objectRepository.findById(id).orElse(null);
    }

    // 仅检查缓存的方法:缓存存在则返回对象,不存在直接返回null,不执行仓储查询
    public Object checkCacheOnly(Long id) {
        // 获取指定名称的缓存实例
        Cache cache = cacheManager.getCache("objects");
        if (cache == null) {
            return null;
        }
        // 根据key查询缓存,不会触发任何业务方法
        Cache.ValueWrapper valueWrapper = cache.get(id);
        return valueWrapper != null ? valueWrapper.get() : null;
    }

    // 你的@CachePut方法(负责写入/更新缓存)
    @CachePut(cacheNames = "objects", key = "#object.id")
    public Object update(Object object) {
        return objectRepository.save(object);
    }
}

这种方式逻辑清晰,完全由你控制缓存查询行为,不会触发不必要的业务操作,完美匹配你的需求。

方法二:利用@Cacheable的条件属性(不推荐)

如果想基于注解实现,可以通过condition和unless属性控制缓存行为,但注意:这种方式下,缓存未命中时目标方法仍然会执行,只是不会将结果存入缓存,仅适用于你能接受方法执行但不想存结果的场景:

@Cacheable(cacheNames = "objects", key = "#id", unless = "true")
public Object findObjectWithoutStore(Long id) {
    return objectRepository.findById(id).orElse(null);
}

提示:该方法仍会执行仓储查询,不符合你"仅检查缓存"的核心需求,因此更推荐第一种方案。

关键注意点

  • 确保缓存配置(如Caffeine、Ehcache等)已正确初始化,CacheManager能获取到对应名称的缓存实例。
  • 手动操作缓存时,要保证缓存key的生成规则和@Cacheable/@CachePut完全一致,避免出现key不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:52:49