Jim*_*ane 5 python google-app-engine app-engine-ndb
我正在使用后端编写多个实体ndb.put_multi(list_of_entities).
我遇到的问题是,如果我进行查询,那么我就没有结果.如果我将睡眠定时器放置例如1秒,我可以读取我刚写的实体.
例如:
class Picture(ndb.Expando):
pass
class Favourite(ndb.Expando):
user_id = ndb.StringProperty(required=True)
pass
#...make lists with Picture and Favourite kinds
entities = favourites
entities[1:1] = pictures
ndb.put_multi(entities)
favourites = Favourite.query().filter(Favourite.user_id == user_id).fetch(99999, keys_only=True)
logging.info(len(favourites)) #returns 0 in dev_appserver why?
Run Code Online (Sandbox Code Playgroud)
首先假设问题与缓存有关.但是:
高级注释:这些方法与上下文和缓存正确交互; 它们不直接对应于特定的RPC调用.
阅读NDB缓存
上下文缓存
上下文缓存仅在单个传入HTTP请求的持续时间内持续存在,并且仅对处理该请求的代码"可见".它很快; 这个缓存存在于内存中.当NDB函数写入数据存储区时,它还会写入上下文缓存区.当NDB函数读取实体时,它首先检查上下文缓存.如果在那里找到实体,则不会发生数据存储交互.
查询不会在任何缓存中查找值.但是,如果缓存策略这样说(但从不对Memcache),查询结果将写回到上下文缓存中.
嗯,我迷失在这里.一切似乎都没问题.即使从控制台查询我得到正确的总和,但从不在同一个处理程序,无论什么功能等.
我唯一注意到的是,当等待时,time.sleep(1)我得到了正确的结果.这与ndb.put_multi可能无法同步完成的事实有关.如此迷茫....
早上清醒的头脑总是比晚上头晕的头脑更好.
谢谢大家的评论.问题解决了.你以正确的方式引导我,以便回答我的问题:
我使用祖先查询来正确获取结果.值得一提的是以下内容
写入数据的NDB函数(例如put())在高速缓存失效后返回; 该应用相异步发生.
这意味着在每次投入之后,申请阶段可能尚未完成.
和:
此行为会影响数据对应用程序可见的方式和时间.在NDB函数返回后几百毫秒左右,更改可能无法完全应用于基础数据存储区.在应用更改时执行的非祖先查询可能会看到不一致的状态(即,部分但不是全部更改).有关写入和查询的时间的更多信息,请参阅App Engine中的事务隔离.
还有一些关于从Google Academy获取读取和写入之间的一致性的事情从数据存储区检索数据
Google App Engine的高复制数据存储(HRD)通过在多个数据中心同步存储数据,为您的读写提供高可用性.但是,从提交写入到在所有数据中心中变为可见之间的延迟意味着跨多个实体组(非祖先查询)的查询只能保证最终的一致结果.因此,此类查询的结果有时可能无法反映基础数据的最新更改.但是,通过其密钥直接获取实体始终是一致的.
感谢@Paul C不断帮助,@ dragonx和@sologoub帮助我理解.
| 归档时间: |
|
| 查看次数: |
3384 次 |
| 最近记录: |