2012-08-31 40 views
2
@Cached(key="homePage") 
public static Result index() { 
    return ok("Hello world"); 
} 

文档没有告诉我有关智能缓存的更多信息。这真的是我必须做的吗?Java Play2 - 智能缓存

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

这似乎很好是真的。

更新1:

出于某种原因,这是行不通的

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

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

任何想法?

更新2:

我试图添加duradion像:

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

但它并没有帮助。

+1

你是在开发模式?即使用'play run'而不是'play start'? –

+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. 你把一个价值在Cache中的10 分钟
  2. 到期时间的另一个业务呼叫,使值在高速缓存中过时的和你 希望用户立即通知让你拥有到 从缓存中删除该值将立即
  3. 下一次的值不会在缓存中,将与新的数据重新计算

看来,从缓存中删除将仅在版本2上可用。1(ticket here),并且解决方法是使用相同的密钥和1秒的到期时间将某些内容放入缓存中。