google-app-engine - 引用 Memcache 对象并更新它们

标签 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);

最佳答案

您提供的后一个代码示例是更新内存缓存中网络对象的正确方法,但它的工作方式与您期望的方式不同。

您的用户对象是指从内存缓存中检索到的网络对象的实例。每次从内存缓存检索对象时,您都会得到一个不同的实例。而且,由于实例在逻辑上与缓存中的原始实例不同,因此一旦缓存值更新,这些实例将与缓存版本不同步。

例如:

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/

相关文章:

java - 在 Java 中从 Memcached 存储和检索 Protocol Buffer 数据

java - Google Drive API上传文件异常

google-app-engine - Google App Engine Golang - 如何获取用户的 IP 地址?

java - Appengine blobstore 作为文件系统的限制和问题

python - 缓存一个大对象并从缓存中快速读取 flask

java - 使用 hibernate/jpa/memcache 缓存大数据集?

php - 替换 PHP session

python - 将 GAE 远程 API 连接到 dev_appserver.py

google-app-engine - `ghs.google.com`域的机制是什么?

java - 如何使用数据库实现memcached?