2

Play!play.api.Cacheではシングルトン オブジェクトであるため、他のすべてのオブジェクトからグローバルにアクセスできます。そして、その性質上、キャッシュは変更可能なオブジェクトです。このようなグローバルな可変状態は、一般的に非常に問題があります。

特に、キー衝突の潜在的な問題があります。2 つの異なるクラス (それ以外の場合は互いに疎結合) は、同じキーを使用して何らかの値を保存することができます。次に、更新の 1 つが他の更新によって上書きされます。

この問題の解決策の 1 つは、globalCacheに委任することもできる新しいクラスを作成することですが、キーにある種の「名前空間」を追加することです。これを実装するのは難しくありませんが、この問題に対する何らかの標準的な解決策がすでにある (できれば Play! 自体に実装されている) 方がよいでしょう。ありますか?

4

1 に答える 1

1

最も簡単な方法は、キーに識別子を追加することです。たとえば、特定のUserクラスを"user"+user.idキャッシュに保存するときにキーとして使用します。そうすれば、衝突を心配する必要はありません。

単一の Play アプリケーションで使用されるキャッシュを考慮していることに注意してください。デフォルトでは、EhCache は Play が使用しているのと同じ JVM スペースを使用するため、そこに 2 つの異なるUserクラスが存在することはありません。複数のアプリがキャッシュを共有している外部キャッシュを使用している場合は、名前空間をそれらのキー (appName.class.classIdまたは同様のもの) に追加する必要があります。しかし、これはスタンドアロンの Play アプリケーションでは問題になりません。

キャッシュを空にする方法に関するコメントについては、通常は気にする必要はありません。理論的には、長期的に古いキーは使用されないため、キャッシュから削除されます。キャッシュの実装 (LRU など) に基づいてどのように/いつ変更されるかについての詳細は、非常に具体的な制約がない限り、問題にはなりません。

于 2012-11-01T09:20:59.907 に答える