2012-10-31 18 views
2

In Play !, play.api.Cache是一個單身物件,因此可以從所有其他物件全局訪問。而且,就其性質而言,緩存是一個可變對象。像這樣的全局可變狀態通常很成問題。如何在使用Play時避免重點衝突!緩存對象?

特別是存在重大碰撞的潛在問題。兩個不同的類(否則它們彼此鬆散地耦合)可能會偶然使用相同的密鑰來存儲某個值。然後,其中一個更新將被另一個更新。

解決這個問題的一個可能的方法是創建一個新的類,它甚至可以委託給全局的Cache,但是在鍵上添加某種「名稱空間」。即使這不難實現,如果已經有一些針對此問題的標準解決方案(最好在Play!本身實現),那將會更好。有沒有?

+0

+1但你是否已經命名你的密鑰?我通常在有問題的域之後命名緩存密鑰+其他一些唯一標識符,如用戶標識,時間戳等。清除緩存對於我來說是一個更大的擔憂,如何通過密鑰前綴清除緩存?這將非常有用。 – virtualeyes

+0

只是建議:我總是試圖保持緩存鍵的約定:'classname.methodname.additionalparams.moreadds'它不是一個明智的解決方案,但有一點幫助。 BTW仍然沒有時間仔細研究Ehcache'索引'/'搜索API'也許使用它們可以避免衝突。 – biesior

回答

1

最簡單的方法是將一個標識符添加到您的密鑰。例如,給定User類,則在將它保存到高速緩存時使用"user"+user.id作爲鍵。這樣你就不必擔心衝突。

請注意,我正在考慮單個Play應用程序使用的緩存。默認情況下,EhCache使用與Play相同的JVM空間,所以在那裏不能有兩個不同的User類。如果您正在使用外部緩存,其中有多個應用共享緩存,那麼您應該爲它們添加一些命名空間密鑰(appName.class.classId或類似的)。但是,這不應該是獨立的Play應用程序中的問題。

關於如何清空緩存的評論,通常你不需要擔心它。理論上,長期的舊密鑰將從緩存中刪除,因爲它們不被使用。有關如何/何時可能會根據緩存實現(LRU等)進行更改的詳細信息,但除非您有非常特定的限制,否則不應該成爲問題。