2

これは、GAE /JavaMemcacheに関する非常に一般的な質問です。

Memcacheに格納されているNetworkというオブジェクトがあり、Networkへの参照を持つUserという別のオブジェクトがあります。

Network network=Memcache.get(networkKey);
user._network=network;    //user references an object that came from Memcache...

これで、user._networkを変更するコードがたくさんあります(Memcacheに触れることなく):

user._network = // Memcacheに触れずに、オブジェクトにいくつかの変更を加えます

さて、ここに質問があります。コードをそのまま見て、最後の行でmemcacheのネットワークオブジェクトが更新されましたか?更新されたネットワークオブジェクトにアクセスする必要のあるサーブレットがあります。問題は、Memcacheオブジェクトを通常のオブジェクトと見なして間違っているかどうかです。

おそらく正しい方法はこれですか?

Network network=Memcache.get(networkKey);
network.doUpdate();
Memcache.put(key,network);
4

2 に答える 2

4

提供した後者のコード例は、memcache内のネットワークオブジェクトを更新する正しい方法ですが、期待した方法とは異なる動作をします。

ユーザーオブジェクトは、memcacheから取得されたネットワークオブジェクトのインスタンスを参照します。memcacheからオブジェクトを取得するたびに、異なるインスタンスを取得します。また、インスタンスはキャッシュ内の元のインスタンスと論理的に異なるため、キャッシュされた値が更新されるとすぐに、それらのインスタンスはキャッシュされたバージョンと同期しなくなります。

例えば:

Network network=Memcache.get(networkKey);
Network networkTwo = Memcache.get(networkKey);
user._network=network;
networkTwo.doUpdate();
// network and networkTwo are now different
Memcache.put(networkKey,networkTwo);
// user._network still refers to the initial instance of network, not networkTwo

Userオブジェクトが常にmemcacheにあるネットワークのバージョンを参照するようにするには、コードに追加のロジックが必要になります。

于 2012-05-01T20:34:12.613 に答える
0

コードは memcache の Network オブジェクトを更新しますが、その Network インスタンスのハンドルを既に持っているアプリケーションの他の部分のオブジェクトへの参照は更新されません。Memcache は SERIALIZED オブジェクトを格納します。

GAE で memcache を使用する最良の方法は、Objectify などと組み合わせて、データストア オブジェクトをキャッシュし、生成にコストがかかるオブジェクトの大規模なコレクションを格納することです。頻繁に変更されるオブジェクトや、アプリケーション内の他の多くのオブジェクトによって使用されるオブジェクトの格納には適していません。

于 2012-05-01T20:37:34.373 に答える