2

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

示例案例:

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

结果:

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

问题:

浏览了 High Replication 文档和 Google IO 视频后,我了解到写入延迟较高,但是,NDB 缓存不应该解决这个问题吗?即缓存写入,然后异步实际写入磁盘,因此,立即读取将从缓存中读取,因此应该没有问题。我需要强制执行一些其他设置吗?

4

2 回答 2

2

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

于 2012-09-11T21:47:30.913 回答
2

我怀疑这可能是因为返回 NoneType 的重定向。

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

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

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

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

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

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

另外我建议在生产服务器上尝试它,有时行为在本地和生产中可能会有很大不同。

于 2012-09-11T11:14:51.510 回答