挂起方法调用的Spring缓存

时间:2014-08-20 06:43:54

标签: spring caching

假设我正在编写一个由外部应用程序调用的Spring Web服务。该应用程序请求我需要从外部资源加载的数据。此外,设计使用不同参数调用我的服务不止一次。换句话说,坐在应用程序前面的用户按下一个按钮,这会在很短的时间内向我的网络服务生成一堆请求。

我的网络服务解析参数并向外部资源提出必要的请求。逻辑认为它可能导致一遍又一遍地使用相同的参数调用外部资源,这使得它成为缓存的理想候选者。

示例:

  1. 用户按下应用程序中的那个按钮
  2. 应用程序向我的网络服务发起十个请求
  3. 我的网络服务并行接收
  4. 在分析了所有请求的参数后,总体而言我需要调用外部资源15次,但参数大致相等,只显示三次调用足以满足15个预期的呼叫。
  5. 但是,对外部资源的一次调用可能需要一些时间。

    据我所知how Spring does caching,它将@Cachable方法的结果写入缓存。显然这意味着在它使用与cache hit相同的参数处理该方法的另一个调用之前,它必须具有先前调用的结果。这意味着它不支持挂起的方法调用。

    我需要类似“嘿,我刚刚看到一个方法调用在一秒钟之前使用相同的参数,但我仍然在等待调用的结果。虽然我还不能提供结果,但我会坚持新的调用并重用它的结果。“

    我有什么选择?我可以让Spring这样做吗?

1 个答案:

答案 0 :(得分:1)

你不能让Spring开箱即用,这是有充分理由的。最重要的是,使用特定的缓存实现锁定和同步非常困难,因此尝试在抽象中执行此操作有点疯狂。您可以找到一些基本原理和一些讨论here

讨论了使用ehcache的BlockingCache SPR-11540

Guava也有这样的功能,但需要以非常特定的方式(使用回调)访问缓存,CacheInterceptor并不真正适合。我们仍然计划在某个时候努力完成这项工作。

不要忘记缓存必须是透明的(即打开和关闭它只会导致性能变化)。尝试解析参数并计算应对Web服务进行的调用很有可能导致副作用。也许你应该把东西放在不同的地方?