2

这是关于 GAE / Java Memcache 的一个非常普遍的问题:

我有一个名为 Network 的对象,它存储在 Memcache 中,我还有另一个名为 User 的对象,它引用了 Network 。

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

现在我有一堆代码可以改变 user._network(不接触 Memcache):

user._network= // 对对象进行一些更改,而不涉及 Memcache

好的,问题来了,看看代码,最后一行是否更新了内存缓存中的网络对象?我有需要访问更新的网络对象的 servlet,问题是我是否将 Memcache 对象视为常规对象是错误的。

也许正确的方法是这样?

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

2 回答 2

4

您提供的后一个代码示例是更新 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

如果您希望用户对象始终引用内存缓存中的网络版本,则需要在代码中添加额外的逻辑。

于 2012-05-01T20:34:12.613 回答
0

该代码确实会更新 memcache 中的 Network 对象,但不会更新对应用程序其他部分中已经拥有该 Network 实例句柄的对象的引用。Memcache 存储 SERIALIZED 对象。

在 GAE 中使用 memcache 的最佳方式是与 Objectify 之类的东西结合使用,以缓存数据存储对象并存储生成成本高昂的大型对象集合。它不太适合存储经常更改的对象或应用程序中许多其他对象使用的对象。

于 2012-05-01T20:37:34.373 回答