2016-08-12 73 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會話截然不同。