给定请求的Spring缓存


问题内容

我正在使用Spring MVC编写Web应用程序。我有一个看起来像这样的界面:

public interface SubscriptionService
{
    public String getSubscriptionIDForUSer(String userID);
}

getSubscriptionIDForUser实际上使网络调用其他服务来获取用户的签约细节。我的业务逻辑在其逻辑中多次调用此方法。因此,对于给定的HTTP请求,我可能对此方法进行了多次调用。因此,我想缓存此结果,以便不会针对同一请求重复进行网络调用。我查看了Spring文档,但找不到有关如何为同一请求缓存此结果的参考。不用说,如果它是对缓存的新请求,则应将其视为无效userID

我的要求如下:

  1. 对于一个HTTP请求,如果对进行了多次调用getSubscriptionIDForUser,则实际方法仅应执行一次。对于所有其他调用,应返回缓存的结果。

  2. 对于不同的HTTP请求,即使方法参数完全相同,我们也应该进行新的调用并忽略缓存命中。

  3. 业务逻辑可以从不同线程并行执行其逻辑。因此,对于相同的HTTP请求,线程1当前可能正在getSubscriptionIDForUser调用方法,并且在方法返回之前,线程2还会尝试使用相同的参数来调用相同的方法。如果是这样,则应使线程2等待从线程1发出的调用的返回,而不是再进行另一个调用。从Thread-1调用的方法返回后,Thread-2应该获得相同的返回值。

有指针吗?

更新:我的Web应用程序将部署到VIP后面的多个主机上。我最重要的要求是请求级别缓存。由于每个请求将由单个主机提供服务,因此我只需要在该主机中缓存服务调用的结果。具有相同userID的新请求不得从缓存中获取该值。我已经浏览了文档,但是找不到有关如何完成操作的参考。可能我在找错地方了吗?


问题答案:

马上想到EHCache,或者您甚至可以自行解决方案将结果缓存在服务层中。这里可能有十亿个缓存选项。选择取决于几个因素,例如您是否需要这些值来超时,或者您要手动清除缓存。您是否需要分布式缓存,就像您有一个无状态REST应用程序分布在多个应用程序服务器之间的情况一样。您需要可以在崩溃或重新启动后幸免的强大功能。