使用高复制数据存储区+ NDB进行写入/读取

时间:2012-09-11 10:41:26

标签: google-app-engine python-2.7 google-cloud-datastore

所以我最近一直在阅读很多关于HRD和NDB的文档,但我仍然对NDB如何缓存事情有所怀疑。

示例案例:

想象一下用户写入数据并且应用程序需要在写入后立即获取数据的情况。例如。用户创建“组”(类似于Facebook / Linkedin组)并在创建后立即重定向到组。 (现在,我正在创建一个组而不将其指定为祖先)

结果:

在本地测试此类功能(启用高复制)时,新创建的组的立即提取失败。返回NoneType。

问题:

完成了High Replication文档和Google IO视频,我知道有更高的写入延迟,但是,NDB缓存不应该解决这个问题吗?即写入被缓存,然后异步地实际写入磁盘,因此,立即读取将从缓存读取,因此应该没有问题。我是否需要执行其他一些设置?

2 个答案:

答案 0 :(得分:2)

我怀疑可能是因为重定向导致返回NoneType。

https://developers.google.com/appengine/docs/python/ndb/cache#incontext

  

上下文缓存仅在单个传入HTTP请求的持续时间内持续存在,并且仅对处理该请求的代码“可见”。它很快;这个缓存存在于内存中。当NDB函数写入数据存储区时,它还会写入上下文缓存区。当NDB函数读取实体时,它首先检查上下文缓存。如果在那里找到实体,则不会发生数据存储交互。   查询不会在任何缓存中查找值。但是,如果缓存策略这样说,则查询结果将写回到上下文缓存中(但永远不会发送到Memcache)。

因此,您正在将值写入缓存,重定向它然后读取失败,因为重定向上的HTTP请求是不同的,因此缓存是不同的。

我在这里达到了我的知识极限,但我建议你最初在交易中尝试创建并在完成/成功时重定向。

https://developers.google.com/appengine/docs/python/ndb/transactions

此外,当您将组模型放入数据存储区时,您将获得一个密钥。你可以将该密钥(例如通过urlsafe)传递给重定向,然后你可以保证在拥有它的显式密钥时检索数据吗?如果它毕竟不在数据存储区中,那就不能拥有它的密钥。

此外,我建议在生产服务器上按原样尝试,有时行为可能在本地和生产上有很大差异。

答案 1 :(得分:2)

非常确定您遇到了HRD功能,其中查询“最终一致”。 NDB的缓存与此行为无关。