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 回答
3

这是一个示例,如果您使用默认的 EhCachePlugin

import play.api.Play.current

...

for(p <- current.plugin[EhCachePlugin]){
  p.manager.clearAll
}
于 2013-08-29T15:06:09.427 回答
2

感谢@alessandro.negrin 指出如何访问 EhCachePlugin。

以下是该方向的一些进一步细节。使用 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)

然后您可以访问 Cache 实例方法,例如ehCache.removeAll()

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

请注意,这与@alessandro.negrin 描述的cacheManager.clearAll()不同,根据文档:“清除 CacheManager,(...) 中所有缓存的内容”,可能是“播放”缓存之外的其他 ehCache。

此外,您可以访问 Cache 方法,例如getKeys可能允许您选择包含 a 的键子集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

在 Play 2.5.x 中,可以EhCache直接访问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 回答
1

您可以编写一个 Akka 系统调度程序和 Actor 以在给定的时间间隔清除缓存,然后将其设置为在您的全局文件中运行。Play Cache api没有列出所有键的方法,但我使用调度程序作业通过在我的缓存键列表上手动使用 Cache.remove 来管理清除缓存。如果您使用的是Play 2.2,则缓存模块已移动。一些缓存模块有一个 api 来清除整个缓存。

于 2013-07-22T08:44:11.597 回答
0

将用于缓存的所有键存储在 Set 中,例如 HashSet,当您想要删除整个缓存时,只需遍历集合并调用

Iterator iter = cacheSet.iterator();
while (iter.hasNext()) {
   Cache.remove(iter.next());
}
于 2016-08-24T09:31:31.733 回答