在Spring MVC Rest服务中缓存HTTP响应


问题内容

我有一个Spring MVC
rest服务,它以XML返回数据。我想缓存此xml响应。我该如何实现?是否可以使用mvc:interceptors来做到这一点?


问题答案:

您可以进行这项工作,但我认为有更好的解决方案。

首先,如果要使用Spring
MVC拦截器,则将使用postHandle方法将某些内容存储在缓存中,并使用preHandle检查缓存和可能的绕过处理。问题是,您将什么存储在缓存中。您将需要存储完整的响应。这意味着您将必须轻松地从postHandle中的ModelAndView获得完整的响应。这可能很容易,也可能不容易,具体取决于您的工作方式。

您很可能最好同时使用其他缓存机制。我建议在Web服务器级别进行缓存。如果您要缓存在拦截器级别,尤其是这样,因为它正好位于Web服务器的“下一个”,并且在此重新发明轮子,我看不出任何好处。Apache有一个缓存模块。Nginx也是如此。清漆也很棒。

我还应该提到,在确定需要缓存之前(不要过早优化),不要缓存。这是浪费您的时间和精力。其次,当确定确实存在需要解决的性能问题(并且缓存是正确的解决方案)时,应在正确的位置缓存正确的数据。

现在,假设您确定确实存在性能问题,并且某种缓存是一个很好的解决方案。接下来要确定的是可以缓存的内容。如果对于每个URL,您返回相同的数据,那么最好在Web服务器(Apache,nginx,Varnish等)级别进行缓存。

通常,您会遇到两个客户端访问相同URL并获取不同数据的情况。这在Facebook之类的网站上最容易看到。登录后,我看到的数据与朋友看到的数据不同。在这种情况下,您将无法在Web服务器级别进行缓存。您将需要在应用程序内部进行缓存。通常,这意味着在数据库级别进行缓存。