Spring Cache - 仅当 API 响应成功时才清除缓存

标签 spring spring-boot caching

我正在使用 Spring Cache @CacheEvict@Cacheable

目前,我每小时运行一个调度程序来清除缓存,下次调用 fetchUser() 时,它将从外部 APi 获取数据并添加到缓存中。

@Scheduled(cron = "0 0 * * * *}")
@CacheEvict(value = "some-unique-value", allEntries = true)
public void clearUserCache() {
    log.info("Cache cleared");
}

@Cacheable(value = "some-unique-value", unless = "#result.isFailure()")
@Override
public Result<UserResponse> fetchUser() {
    try {
        UserResponse userResponse = api.fetchUserDetail();
        return Result.success(userResponse);
    } catch (Exception e) {
        return Result.failure(INTERNAL_SERVER_ERROR);
    }
}

现在我们需要的是仅当用户 API 调用成功时才清除缓存。有没有办法做到这一点。

现在缓存已按计划清除,并且假设外部 API 调用失败。主API将返回错误响应。在这种情况下,我应该能够使用现有的缓存本身。

最佳答案

如果我得到的结果是正确的,那么在检查该方法的父方法的 API 调用是否正确后,为什么不将其作为普通方法调用呢?

使用您的代码,类似于

// we just leave scheduled here as you need it.
@Scheduled(cron = "0 0 * * * *}")
@CacheEvict(value = "some-unique-value", allEntries = true)
public void clearUserCache() {
    log.info("Cache cleared");
}

@Cacheable(value = "some-unique-value", unless = "#result.isFailure()")
@Override
public Result<UserResponse> fetchUser() {
    try {
        UserResponse userResponse = api.fetchUserDetail();
        return Result.success(userResponse);
    } catch (Exception e) {
        return Result.failure(INTERNAL_SERVER_ERROR);
    }
}

public void parentMethod() {
    Result<UserResponse> userResult = this.fetchUser();
    if(userResult.isFailure()) {
        this.clearUserCache();
    }
}

这样,如果抛出任何异常,它将返回一个失败状态,您可以检查它。因此,缓存将每小时当它不起作用时被清除。

所以下次,由于失败并且没有缓存,它会重试。

关于Spring Cache - 仅当 API 响应成功时才清除缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63775298/

相关文章:

asp.net - Web API缓存-如何使用分布式缓存实现无效

android - JakeWharton 的 DiskLruCache 示例

java - Spring Security OpenID - 无法处理声明的身份 "null"

postgresql - 无法通过 Spring Boot 将 Docker Desktop Kubernetes (Windows) 服务连接到本地 Postgres 数据库

spring - 硬限制连接 Spring Boot

caching - memcached 与基于数据库的键值表?

Spring 3 mvc 命名空间和 i18n

java - 当数据源动态变化时如何设计 DAO

java - 异常(exception):实体映射中的重复列:列:哈希(应使用 insert ="false"update ="false"进行映射)

java - 使用 Elastic BeansTalk CLI 部署 Spring Boot 应用程序