当前位置: 首页 > 知识库问答 >
问题:

如何检测@Cacheable方法输出是否来自缓存?

雍宇定
2023-03-14

有一个用@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并检测输出是否来自缓存?

共有2个答案

姬慎之
2023-03-14

您可以更改用户数据,看看返回的值是旧值还是新值

勾喜
2023-03-14

取决于您需要检测的时间——在部署应用程序的运行时,还是在开发期间。

无论哪种方式,基本思想都是一样的:必须有一个底层数据源,比如数据库(UserRepository?)或者API调用或者其他什么。

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

--或--

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

 类似资料:
  • 好吧,所以我正在做这个项目,你必须做一些来自用户的输入 让我们说如果他进入 "12 3" 但他没有输入第二个输入 如果我把它叫做 如果我打电话 我有错误。我如何检查是否没有第二次输入? 公共静态void main(String [] args)引发IOException{ 如果用户输入 "3 2" 但没有进入第二个...我得到nullpointerx0016

  • 问题内容: 我正在为OS X和Linux编写一个C程序,并且我想根据是否将其输出到终端来调整输出。我知道我们已经在Shell脚本中介绍了如何执行此操作 但是,如何在C程序中执行此操作? 问题答案: 用途: 由于始终是文件描述符1,因此您可以执行以下操作:

  • 问题内容: 我想知道,您可以在现有缓存中调用的方法吗?还是在性能关键代码中最好将其存储在本地int中? 当您在调用之间不添加/删除项目时,我希望它确实已缓存。 我对吗? 更新 我不是在谈论内联或类似的东西。我只想知道方法本身是否在内部缓存值,或者每次调用时它都会动态计算。 问题答案: 我想我不会说它是“缓存的”-但是它只是存储在一个字段中,因此它足够快以经常调用。 Sun JDK的实现只是:

  • 本文向大家介绍PHP+Ajax实时自动检测是否联网的方法,包括了PHP+Ajax实时自动检测是否联网的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP+Ajax实时自动检测是否联网的方法。分享给大家供大家参考。具体实现方法如下: html部分代码: php部分代码: 希望本文所述对大家的php程序设计有所帮助。

  • 我正在和一个班合作。我正在使用一些方法。 我需要检查我需要传递的参数,来调用这个方法。我就是这样做的 它工作得很好,但我知道有些方法有重载(没有参数),但这段代码只显示最后声明的方法(有参数要调用)。我怎样才能同时得到这两个重载? 这就是它的样子(我知道这个方法有重载) 例如另一个类:类扫描比打印方法方法 要扫描的代码 类的构造函数,它扫描给定的对象。 这就是我打印它们的方式。

  • 问题内容: 我正在尝试将长度不定的多个数据列表输出到CSV文件。每个列表应该是输出CSV文件中的一列。有直接的做事方法吗?如果我将每个列表输出为一行,那么我将遍历每个列表并在结束时输出返回值,但是这种方法在按列工作时不起作用。 我曾想过一次逐项检查所有列表并增加一个计数器,但这也会失败,因为有些列表比另一些​​更长。为了解决这个问题,我将不得不在每次迭代时检查计数器是否在每个列表的末尾,这在计算方