2012-08-31 37 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秒的到期時間將某些內容放入緩存中。