Documentation

§Play キャッシュ API

データのキャッシュは、近年のアプリケーションでは典型的な最適化であるため、Play は包括的なキャッシュを提供します。

キャッシュに関する重要な点は、格納したデータが消失するかのようにふるまうことです。

キャッシュに格納されたデータについて、データが失われた場合に備えて再生手段を用意しておく必要があります。この哲学は Play を支える基本のひとつであり、セッションがその生存期間を通じてずっと値を保持することが期待されている Java EE とは異なります。

キャッシュ API のデフォルト実装は EHCache です。

§キャッシュ API のインポート

依存ライブラリの一覧に cache を追加してください。 build.sbt の例です。

libraryDependencies ++= Seq(
  cache,
  ...
)

§キャッシュ API へのアクセス

キャッシュ API は CacheApi オブジェクトとして提供され、他の依存関係と同じようにコンポーネントに注入することができます。例を示します。

import play.api.cache._
import play.api.mvc._
import javax.inject.Inject

class Application @Inject() (cache: CacheApi) extends Controller {

}

Note: 様々な実装をプラグインできるように、キャッシュ API の機能は意図的に最小限に絞りこまれています。より特殊な API が必要な場合、独自のキャッシュプラグインにその API を持たせるとよいでしょう。

このシンプルな API を使用して、データをキャッシュに格納できます。

cache.set("item.key", connectedUser)

そして、保存したデータを後で取得するためには、次のようなコードを記述します。

val maybeUser: Option[User] = cache.get[User]("item.key")

値がキャッシュに保存されていればそれを取得し、そうでなければ保存するという機能を持つ便利なヘルパ関数もあります。

val user: User = cache.getOrElse[User]("item.key") {
  User.findById(connectedUser)
}

期間を渡すことによって有効期間を指定できます。デフォルトでは期間は無限です。

import scala.concurrent.duration._

cache.set("item.key", connectedUser, 5.minutes)

remove メソッドでデータをキャッシュから削除することができます。

cache.remove("item.key")

§異なるキャッシュへのアクセス

別のキャッシュにアクセスすることができます。デフォルトのキャッシュは play と呼ばれ、ehcache.xml というファイルを作成することにより設定できます。追加のキャッシュは別の設定、または実装によっても構成できます。

複数の異なる Ehcache キャッシュにアクセスしたい場合、それらを application.conf 内に記述して Play に区別させる必要があります。このような感じです。

play.cache.bindCaches = ["db-cache", "user-cache", "session-cache"]

これらの異なるキャッシュへアクセスするには、注入する際に依存関係に NamedCache 修飾子を使用します。例を示します。

import play.api.cache._
import play.api.mvc._
import javax.inject.Inject

class Application @Inject()(
    @NamedCache("session-cache") sessionCache: CacheApi
) extends Controller {

}

§HTTP レスポンスのキャッシュ

標準的なアクション合成の方法を使って、簡単にスマートなキャッシュ機能を備えたアクションを実装できます。

メモ: Play HTTP の Result インスタンスはキャッシュして後で再利用しても安全です。

Cached クラスはキャッシュされるアクションを作成するのに役立ちます。

import play.api.cache.Cached
import javax.inject.Inject

class Application @Inject() (cached: Cached) extends Controller {

}

"homePage" のような固定されたキーを使って、アクションの結果をキャッシュできます。

def index = cached("homePage") {
  Action {
    Ok("Hello world")
  }
}

結果が変化する場合、異なるキーを使ってそれぞれの結果をキャッシュすることができます。この例では、それぞれの結果はユーザごとにキャッシュされます。

def userProfile = Authenticated {
  user =>
    cached(req => "profile." + user) {
      Action {
        Ok(views.html.profile(User.find(user)))
      }
    }
}

§キャッシュ制御

キャッシュしたり、キャッシュから除外することを簡単に制御できます。

200 Ok の結果だけをキャッシュすることもできます。

def get(index: Int) = cached.status(_ => "/resource/"+ index, 200) {
  Action {
    if (index > 0) {
      Ok(Json.obj("id" -> index))
    } else {
      NotFound
    }
  }
}

また数分間だけ 404 Not Found をキャッシュすることもできます。

def get(index: Int) = {
  val caching = cached
    .status(_ => "/resource/"+ index, 200)
    .includeStatus(404, 600)

  caching {
    Action {
      if (index % 2 == 1) {
        Ok(Json.obj("id" -> index))
      } else {
        NotFound
      }
    }
  }
}

§カスタム実装

デフォルト実装を置き換えるか、または合わせて使う CacheApi の独自実装を提供できます。

デフォルトの実装を置き換える場合、次のように application.conf でデフォルトの実装を使用不可にする必要があります。

play.modules.disabled += "play.api.cache.EhCacheModule"

その後で、単純に CacheApi を実装し、DI コンテナ にバインドします。

デフォルトの実装に加えてキャッシュ API の実装を提供するには、カスタムの修飾子を作るか、NamedCache 修飾子を再利用するかして実装をバインドします。

Next: Web サービスの呼び出し


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。