1

キーまたはIDでエンティティをロードおよび保存するために単純なレイヤーを使用し、このレイヤーにキャッシュを追加しました。指定されたキーを持つエンティティがキャッシュにある場合、データストアからフェッチするのではなく、それを返します。また、エンティティが更新されてデータストアに保存されると、レイヤは単にキャッシュ内のエンティティを null に設定します。完全に透明です。

正常に動作しているように見えますが、キャッシュからフェッチされたオブジェクトは、データストアからフェッチされたオブジェクトとわずかに異なります。たとえば、いくつかのことが機能しなくなり、エンティティ内のコレクションで .contains() を使用して、2 つのエンティティ間に関係があるかどうかを確認できません。また、キャッシュからオブジェクトをロードし、その直後にデータストアに保存したときに、関係を表すコレクション内のすべてのアイテムがnulls に置き換えられたという奇妙な動作にも遭遇しました。しかし、私はそれを再現できませんでした。今では正常に動作しています。

内部で何が起こっているのかわからないので、問題は、キャッシュを操作するこの方法は信頼できるかということです。データストアからフェッチされたのと同じように、キャッシュからフェッチされたエンティティを操作できますか (子へのアクセス、更新、削除など)?

4

1 に答える 1

3

注意すべき2つのこと:

  1. Memcacheに保存されたすべてのオブジェクトはシリアル化/逆シリアル化されます。つまり、それらのメモリ表現が取得され、一連のバイトに変更されます(またはその逆)。

  2. Collection.contains(object)object.equals(anotherObject)コレクションに特定のオブジェクトが含まれているかどうかを確認するために使用します。デフォルトObject.equals()ではtrue、これがまったく同じオブジェクト(=同じメモリ位置にあるオブジェクト)である場合のみです。

与えられた場合:オブジェクトをシリアル化してから逆シリアル化しても、を与えるオブジェクトは作成されませんdeserialisedObject.equals(originalObject) == true

これが本当に必要な場合は、Memcacheに格納するクラスでオーバーライド.equals()(および.hashCode())する必要があります。これにより、クラス内の意味のある値を実際に比較します(=すべてのフィールドの値を比較します)。

于 2012-08-17T14:56:18.057 に答える