2016-08-12 69 views
2

从缓存文件:https://github.com/objectify/objectify/wiki/Caching物化: “会话缓存” 是如何工作的跨实例

The session cache is local to the Objectify instance. If you start a new session (via ObjectifyFactory.begin()), it will have a separate cache. If you use the thread-local ObjectifyService.ofy() method, the session cache will "just work" appropriately. 

A get-by-key operation (single or batch) for a cached entity will return the entity instance without a call to the datastore or even to the memcache 

我的问题是:

请求1被实例A提供服务:一个对象更新并保持。由于对象已被修改,会话缓存将被更新。

请求2由实例B服务(由于先前的请求,它们已经是会话缓存中的对象):会话缓存将因差异而变得不同,因为它是另一个实例。 请求如何获取更新的实体而不是前一个?

App Engine memcache是​​跨实例共享的,但会话高速缓存对于每个实例(或者甚至是Objectify实例)都是单独的。

会话缓存是否以某种方式在所有实例之间同步?

是否有可能由不同实例提供服务的不同请求可能具有相同对象的不同版本?

回答

3

对象化会话是短暂的并且定义了它自己的范围。通过使用内存,它可以防止多个数据存储在代码的不同部分中获取相同的实体,假设额外的调用通常是浪费的。

如果您需要读/写一致性,那么您必须使用幂等事务(它不会共享会话缓存,并且也会执行脏检查并自动重试)。

通过阅读,变异,然后在事务中写你总是避免的东西可以在其他请求中发生的问题(在其他情况下或以其他方式)

物化会话默认情况下不共享,绝对不该”不要。它们不会跨请求或实例同步。您可以通过将@Cache放在实体上来启用写通缓存来使用memcache,但这与ofy会话截然不同。