这是一个关于 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
好的,问题来了, 看一下代码,最后一行是否更新了memcache中的网络对象?我有需要访问更新的网络对象的 servlet,问题是我将 Memcache 对象视为常规对象是否是错误的。
也许这是正确的方法?
Network network=Memcache.get(networkKey);
network.doUpdate();
Memcache.put(key,network);
最佳答案
您提供的后一个代码示例是更新内存缓存中网络对象的正确方法,但它的工作方式与您期望的方式不同。
您的用户对象是指从内存缓存中检索到的网络对象的实例。每次从内存缓存检索对象时,您都会得到一个不同的实例。而且,由于实例在逻辑上与缓存中的原始实例不同,因此一旦缓存值更新,这些实例将与缓存版本不同步。
例如:
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 对象始终引用内存缓存中的网络版本,则需要在代码中添加额外的逻辑。
关于google-app-engine - 引用 Memcache 对象并更新它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10401862/