2
@Cached(key="homePage")
public static Result index() {
  return ok("Hello world");
}

文档并没有告诉我太多关于智能缓存的信息。这真的是我所要做的吗?

如果内容发生变化怎么办?播放会自动更新缓存吗?

这似乎是真的。

更新1:

由于某种原因它不起作用

 @Cached(key="homePage")
    public static Result index() {
      Logger.info("" + Cache.get("homePage"));
      return ok("Hello world");
    }

如果我理解正确,Logger.info("" + Cache.get("homePage"));应该只调用一次(如果缓存为空)。但是每次我刷新页面时都会调用它。结果也总是空的,所以它甚至不起作用。

有任何想法吗?

更新 2:

我尝试添加持续时间,例如:

@Cached(key="homePage",duration=3000)

但这没有帮助。

4

2 回答 2

5

我觉得问题是由于使用了@Cached 注释。实际上,如果您手动缓存该值,它可以工作,但是如果您使用注释(就像在文档中顺便描述的那样 - 它似乎不起作用。

下面的一段代码可以很容易地演示它:

 @Cached(key="page1")
  public static Result page1() {
      java.util.Date d = Calendar.getInstance().getTime();
      return ok(page.render(d.toString()));
  }

  public static Result page2() {
      Result result = (Result) Cache.get("page2");
      if ( result == null ) {
          java.util.Date d = Calendar.getInstance().getTime();
          result = ok(page.render(d.toString()));
          Cache.set("page2", result);
      }   
      return result;
  }

与以下页面

@(date: String)
@date

和路线

GET     /page1                      controllers.Application.page1()
GET     /page2                      controllers.Application.page2()

如果你去http://localhost:9000/page1日期会在每次调用时改变,而如果你使用它会被有效地缓存http://localhost:9000/page2

这是某种解决方法,但它可以完成工作。

关于您的第一个问题“如果内容发生变化怎么办?播放会自动更新缓存吗?”,我认为情况并非如此,您必须手动从缓存中删除条目(如果您不想等待到期日期)。例如:

  1. 您在缓存中放置了一个过期时间为 10 分钟的值
  2. 另一个业务调用使缓存中的值过时,您希望立即通知用户,因此您必须立即从缓存中删除该值
  3. 下次该值将不在缓存中,并将使用新数据重新计算

似乎从缓存中删除仅适用于 2.1 版(ticket here),解决方法是在缓存中放入具有相同键和 1 秒到期的内容。

于 2012-09-02T07:28:01.187 回答
0

@Cached 似乎在 2.0.4 中被破坏,并且可能也适用于较低版本。注意@With(CachedAction.class)已经不见了。虽然它在当前的主服务器中是固定的:)

现在简单的解决方法是滚动你自己的@Cached 和 CachedAnnotation。只需从 master 复制并粘贴并添加到您的项目中:

于 2012-11-12T20:04:07.363 回答