所以我正在使用Play的内置缓存API,如下所示:http://www.playframework.com/documentation/2.1.x/JavaCache
在我的代码中,我已经将缓存设置为每10分钟到期一次。我也在使用会话缓存样式。
所以我的主要问题是,由于跟踪所有缓存非常困难,如何清除所有缓存?我知道使用Play的默认缓存很少,但此时它对我来说非常合适。我只是希望能够在一段时间内清除缓存,以防万一会话太多而且我的代码中某处堆积了缓存。
答案 0 :(得分:4)
Play Java API没有提供清除整个缓存的方法。
您必须使用自己的缓存插件,或者扩展the existing one来提供此功能。
答案 1 :(得分:3)
这是一个使用默认EhCachePlugin
的示例import play.api.Play.current
...
for(p <- current.plugin[EhCachePlugin]){
p.manager.clearAll
}
答案 2 :(得分: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)
然后您可以访问缓存实例方法,例如 ehCache.removeAll() :
// Removes all cached items.
ehCache.removeAll()
请注意,这与@ alessandro.negrin描述的cacheManager.clearAll()不同 根据doc:&#34;清除CacheManager中所有缓存的内容,(...)&#34;, 潜在的其他ehCache而不是&#34; play&#34;高速缓存中。
此外,您还可以访问可能允许的getKeys
等缓存方法
选择包含matchString
的密钥子集,例如执行删除操作:
val matchString = "A STRING"
val ehCacheKeys = ehCache.getKeys()
for (key <- ehCacheKeys) {
key match {
case stringKey: String =>
if (stringKey.contains(matchString)) { ehCache.remove(stringKey) }
}
}
答案 3 :(得分:2)
在Play 2.5.x中,可以访问EhCache
直接注入CacheManagerProvider
并使用完整的EhCache
API:
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
}
}
答案 4 :(得分:1)
您可以编写Akka系统调度程序和Actor以按给定的时间间隔清除缓存,然后将其设置为在Global文件中运行。 Play Cache api没有列出所有密钥的方法,但我使用调度程序作业来管理在我的缓存键列表上手动使用Cache.remove清除缓存。如果您正在使用Play 2.2,则会移动缓存模块。一些缓存模块有一个api来清除整个缓存。
答案 5 :(得分:0)
将用于缓存的所有密钥存储在一个Set中HashSet以及当您想要删除整个缓存时,只需遍历该集并调用
Iterator iter = cacheSet.iterator();
while (iter.hasNext()) {
Cache.remove(iter.next());
}