3

だから私はここに見られるように Play の組み込みキャッシュ API を使用しています: http://www.playframework.com/documentation/2.1.x/JavaCache

私のコードでは、キャッシュが 10 分ごとに期限切れになるように既に設定しています。セッション キャッシュ スタイルも使用しています。

私の主な質問は、すべてのキャッシュを追跡するのは非常に難しいため、すべてのキャッシュをクリアするにはどうすればよいですか? Play のデフォルト キャッシュの使用が最小限であることはわかっていますが、現時点では完全に機能しています。あまりにも多くのセッションが行われ、コードのどこかでキャッシュが積み重なった場合に備えて、キャッシュを時々クリアする機能が必要です。

4

6 に答える 6

4

Play Java APIには、キャッシュ全体をクリアする方法はありません。

この機能を提供するには、独自のキャッシュ プラグインを使用するか、既存のものを拡張する必要があります。

于 2013-07-17T07:24:36.113 に答える
2

EhCachePlugin へのアクセス方法を指摘してくれた @alessandro.negrin に感謝します。

ここでは、その方向の詳細をいくつか示します。Play 2.2.1 のデフォルトの EhCachePlugin を使用してテスト済み:

  import play.api.cache.Cache
  import play.api.Play
  import play.api.Play.current
  import play.api.cache.EhCachePlugin

  // EhCache is a Java library returning i.e. java.util.List
  import scala.collection.JavaConversions._

  // Default Play (2.2.x) cache name 
  val CACHE_NAME = "play"

  // Get a reference to the EhCachePlugin manager
  val cacheManager = Play.application.plugin[EhCachePlugin]
    .getOrElse(throw new RuntimeException("EhCachePlugin not loaded")).manager

  // Get a reference to the Cache implementation (here for play)
  val ehCache = cacheManager.getCache(CACHE_NAME)

次に、 ehCache.removeAll()などの Cache インスタンス メソッドにアクセスできます。

  // Removes all cached items.
  ehCache.removeAll()

これは、ドキュメントによると、@ alessandro.negrin によって説明されているcacheManager.clearAll()とは異なることに注意してください:「CacheManager 内のすべてのキャッシュの内容を消去します (...)」、「再生」キャッシュ以外の ehCache である可能性があります。

さらにgetKeys、 を含むキーのサブセットを選択できるような Cache メソッドにアクセスできますmatchString。たとえば、次のような削除操作を実行できます。

  val matchString = "A STRING"

  val ehCacheKeys = ehCache.getKeys() 

  for (key <- ehCacheKeys) {
    key match {
      case stringKey: String => 
        if (stringKey.contains(matchString)) { ehCache.remove(stringKey) }
    }
  }
于 2014-06-30T10:32:43.217 に答える
2

EhCachePlay 2.5.x では、直接注入にアクセスしCacheManagerProviderて完全なEhCacheAPIを使用できます。

import com.google.inject.Inject
import net.sf.ehcache.{Cache, Element}
import play.api.cache.CacheManagerProvider
import play.api.mvc.{Action, Controller}

class MyController @Inject()(cacheProvider: CacheManagerProvider) extends Controller {
    def testCache() = Action{
        val cache: Cache = cacheProvider.get.getCache("play")
        cache.put(new Element("key1", "val1"))
        cache.put(new Element("key2", "val3"))
        cache.put(new Element("key3", "val3"))
        cache.removeAll()
        Ok
    }
}
于 2017-06-19T13:20:38.893 に答える