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

ドキュメントは、スマートキャッシングについてあまり教えてくれません。本当にこれでいいの?

内容が変わったら?play は自動的にキャッシュを更新しますか?

これは本当のようです。

更新 1:

なぜかうまくいかない

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

私が正しく理解してLogger.info("" + Cache.get("homePage"));いれば、一度だけ呼び出されるはずです(キャッシュが空の場合)。しかし、ページを更新するたびに呼び出されます。また、結果は常に null なので、機能しません。

何か案は?

更新 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

これはある種の回避策ですが、機能します。

最初の質問「コンテンツが変更されたらどうしますか? play は自動的にキャッシュを更新しますか?」については、そうではなく、手動でキャッシュからエントリを削除する必要があると思います (有効期限を待ちたくない場合)。日にち)。例えば:

  1. 有効期限が 10 分の値をキャッシュに入れます。
  2. 別のビジネス コールによってキャッシュ内の値が無効になり、ユーザーにすぐに通知する必要があるため、キャッシュから値をすぐに削除する必要があります。
  3. 次回は値がキャッシュに存在せず、新しいデータで再計算されます

キャッシュからの削除はバージョン 2.1 (チケットはこちら)でのみ利用できるようで、回避策は同じキーと 1 秒の有効期限で何かをキャッシュに入れることです。

于 2012-09-02T07:28:01.187 に答える
0

@Cached は2.0.4 で壊れているようで、おそらくそれ以前のバージョンでも壊れているようです。@With(CachedAction.class)行方不明になっていることに注意してください。ただし、現在のマスターでは修正されています:)

今のところ簡単な修正は、独自の @Cached および CachedAnnotation をロールすることです。master からコピー アンド ペーストして、プロジェクトに追加するだけです。

于 2012-11-12T20:04:07.363 に答える