【问题标题】:Objectify: how "session cache" works across instances物化:“会话缓存”如何跨实例工作
【发布时间】:2016-08-12 16:49:39
【问题描述】:

来自缓存文档: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 内存缓存在多个实例之间共享,但会话缓存是每个实例(甚至是 Objectify 实例)的单个缓存。

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

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

【问题讨论】:

    标签: google-app-engine session caching instance objectify


    【解决方案1】:

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

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

    通过在事务中读取、变异然后写入,您始终可以避免其他请求中可能发生的问题(在其他实例上或其他情况下)

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

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2010-09-14
      • 2017-08-21
      • 2010-11-29
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多