2013-07-16 70 views
3

所以我用播放內置的緩存API,如下所示:http://www.playframework.com/documentation/2.1.x/JavaCache如何清除所有緩存在遊戲框架2.1

在我的代碼我已經設置緩存爲每10分鐘過期。我也使用會話緩存樣式。

所以我的主要問題是,因爲跟蹤所有的緩存將非常困難,所以如何清除所有的緩存?我知道使用Play的默認緩存是最小的,但在這一點上它完全適合我。我只是希望能夠在一段時間內清除緩存,以防萬一發生過多的會話,並且在我的代碼中某處會堆放緩存。

+0

如何你清除緩存? –

回答

4

Play Java API沒有提供清除整個緩存的方法。

您必須使用自己的緩存插件,或者擴展the existing one以提供此功能。

+0

感謝您的輸入。那麼我知道清除緩存的一種方法是重新編譯代碼。 – cYn

1

您可以編寫一個Akka系統調度程序和Actor以按給定間隔清除緩存,然後將其設置爲在您的Global文件中運行。 Play Cache api沒有列出所有密鑰的方法,但我使用調度程序作業來管理通過在緩存鍵列表上手動使用Cache.remove來清除緩存。如果您使用Play 2.2緩存模塊已移動。一些緩存模塊有一個API來清除整個緩存。

3

這裏有一個例子,如果您使用默認EhCachePlugin

import play.api.Play.current 

... 

for(p <- current.plugin[EhCachePlugin]){ 
    p.manager.clearAll 
} 
2

感謝@ 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) } 
    } 
    } 
0

存儲所有的密鑰是你在Set中使用緩存HashSet的,當你想刪除整個緩存只是遍歷集合並調用

Iterator iter = cacheSet.iterator(); 
while (iter.hasNext()) { 
    Cache.remove(iter.next()); 
} 
1

在玩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 
    } 
}