参考Memcache对象并更新它们

时间:2012-05-01 17:47:23

标签: google-app-engine memcached

这是关于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);

2 个答案:

答案 0 :(得分: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中的网络版本,那么您的代码中将需要其他逻辑。

答案 1 :(得分:0)

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

在GAE中使用memcache的最佳方法是使用Objectify来缓存数据存储对象和存储生成成本高昂的大量对象集合。它不太适合存储频繁更改的对象或应用程序中许多其他对象使用的对象。