Java Play2 - 智能缓存

时间:2012-08-31 00:18:03

标签: java caching playframework-2.0

@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"));应该只调用一次(如果缓存为空)。但每次刷新页面时都会调用它。此外,结果始终为null,因此它甚至不起作用。

有什么想法吗?

更新2:

我尝试添加duradion,如:

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

但它没有帮助。

2 个答案:

答案 0 :(得分: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. 下次该值不在缓存中并将重新计算 新数据
  4. 似乎从缓存中删除只能在版本2.1(ticket here)上使用,并且解决方法是使用相同的密钥和1秒的到期时间在缓存中放置一些内容。

答案 1 :(得分:0)

@Cached似乎是broken in 2.0.4,也可能是较低版本。请注意,@With(CachedAction.class)已丢失。它固定在current master但是:)

现在轻松修复就是推出自己的@Cached和CachedAnnotation。只需从master复制并粘贴并添加到您的项目中: