所以我用播放內置的緩存API,如下所示:http://www.playframework.com/documentation/2.1.x/JavaCache如何清除所有緩存在遊戲框架2.1
在我的代碼我已經設置緩存爲每10分鐘過期。我也使用會話緩存樣式。
所以我的主要問題是,因爲跟蹤所有的緩存將非常困難,所以如何清除所有的緩存?我知道使用Play的默認緩存是最小的,但在這一點上它完全適合我。我只是希望能夠在一段時間內清除緩存,以防萬一發生過多的會話,並且在我的代碼中某處會堆放緩存。
所以我用播放內置的緩存API,如下所示:http://www.playframework.com/documentation/2.1.x/JavaCache如何清除所有緩存在遊戲框架2.1
在我的代碼我已經設置緩存爲每10分鐘過期。我也使用會話緩存樣式。
所以我的主要問題是,因爲跟蹤所有的緩存將非常困難,所以如何清除所有的緩存?我知道使用Play的默認緩存是最小的,但在這一點上它完全適合我。我只是希望能夠在一段時間內清除緩存,以防萬一發生過多的會話,並且在我的代碼中某處會堆放緩存。
Play Java API沒有提供清除整個緩存的方法。
您必須使用自己的緩存插件,或者擴展the existing one以提供此功能。
感謝您的輸入。那麼我知道清除緩存的一種方法是重新編譯代碼。 – cYn
您可以編寫一個Akka系統調度程序和Actor以按給定間隔清除緩存,然後將其設置爲在您的Global文件中運行。 Play Cache api沒有列出所有密鑰的方法,但我使用調度程序作業來管理通過在緩存鍵列表上手動使用Cache.remove來清除緩存。如果您使用Play 2.2緩存模塊已移動。一些緩存模塊有一個API來清除整個緩存。
這裏有一個例子,如果您使用默認EhCachePlugin
import play.api.Play.current
...
for(p <- current.plugin[EhCachePlugin]){
p.manager.clearAll
}
感謝@ alessandro.negrin指點如何訪問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描述cacheManager.clearAll()不同使用播放2.2.1默認EhCachePlugin測試。 negrin 根據doc:「清除CacheManager中所有緩存的內容,(...)」, 潛在的其他ehCache而不是「play」緩存。
此外,您可以訪問緩存的方法,如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) }
}
}
存儲所有的密鑰是你在Set中使用緩存HashSet的,當你想刪除整個緩存只是遍歷集合並調用
Iterator iter = cacheSet.iterator();
while (iter.hasNext()) {
Cache.remove(iter.next());
}
在玩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
}
}
如何你清除緩存? –