【问题标题】:How to detect if @Cacheable method output comes from cache?如何检测@Cacheable 方法输出是否来自缓存?
【发布时间】:2020-01-14 02:40:57
【问题描述】:

有一个用@Cacheable注解的方法返回一个对象:

@Service
public class UserService {

  @Cacheable("userData")
  public UserData getUserData(String userName) {
    UserData userData = new UserData();
    userData.setGotFromCache(false);
    return userData;
  }

}

还有 UserData 对象:

@Getter
@Setter
public class UserData {
  private boolean gotFromCache;
}

如何检测注解@Cacheable的方法是否被调用或输出是否来自缓存?

解决方法是注入CacheManager并手动检测:

Cache cache = this.cacheManager.getCache("userData");
UserData userData = null;
String userName = "some user name";
if (cache != null) {
  Object key = SimpleKeyGenerator.generateKey(userName);
  userData = cache.get(key, UserData.class);
  if (userData != null) {
    userData.setGotFromCache(true);
  } else {
    userData = userService.getUserData(userName);
    cache.put(key, userData);
  }
} else {
  userData = userService.getUserData(userName);
}

然而,为了简单起见,这段代码没有使用@Cacheable注解。

是否可以使用@Cacheable 并检测输出是否来自缓存?

【问题讨论】:

    标签: spring ehcache spring-annotations spring-cache


    【解决方案1】:

    取决于您何时需要检测 - 在运行时部署应用程序时,或在开发期间。

    无论哪种方式,基本思想都是相同的:必须有一个底层数据源,例如数据库(UserRepository?)或 API 调用或其他东西。

    在运行时,您可以通过日志记录或跟踪(例如使用 Zipkin)检查数据源是否被调用。

    --或--

    在开发过程中,您可以为 UserService 编写模拟数据源的单元测试,并验证与模拟对象的“零交互”,表明数据实际上是从缓存中获取的。

    【讨论】:

      【解决方案2】:

      你可以更改userdata,看看返回的值是旧的还是新的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多