Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 使用高复制数据存储写入/读取+;NDB_Google App Engine_Python 2.7_Google Cloud Datastore - Fatal编程技术网

Google app engine 使用高复制数据存储写入/读取+;NDB

Google app engine 使用高复制数据存储写入/读取+;NDB,google-app-engine,python-2.7,google-cloud-datastore,Google App Engine,Python 2.7,Google Cloud Datastore,所以我最近读了很多关于HRD和NDB的文档,但是我仍然对NDB如何缓存东西有一些疑问 示例案例: 想象一下这样一种情况:用户写入数据,应用程序需要在写入数据后立即获取数据。例如,用户创建一个“组”(类似于Facebook/Linkedin组),并在创建后立即重定向到该组。(目前,我正在创建一个组,但没有为其指定祖先) 结果: 在本地测试此类功能时(启用了高复制),新创建的组的立即获取失败。返回一个非类型 问题: 通过查看高复制文档和Google IO视频,我了解到存在更高的写入延迟,但是NDB缓

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

示例案例:

想象一下这样一种情况:用户写入数据,应用程序需要在写入数据后立即获取数据。例如,用户创建一个“组”(类似于Facebook/Linkedin组),并在创建后立即重定向到该组。(目前,我正在创建一个组,但没有为其指定祖先)

结果:

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

问题:


通过查看高复制文档和Google IO视频,我了解到存在更高的写入延迟,但是NDB缓存不应该解决这个问题吗?也就是说,写操作被缓存,然后异步地实际写入磁盘,因此,立即读取将从缓存中读取,因此应该没有问题。是否需要强制执行一些其他设置?

我怀疑可能是由于重定向而返回了非类型

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

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

在这里,我的知识已经达到极限,但我建议您首先尝试在事务中创建,并在完成/成功时重定向

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


另外,我建议在生产服务器上尝试,有时本地和生产上的行为可能会非常不同

我怀疑可能是由于重定向,返回了NoneType

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

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

在这里,我的知识已经达到极限,但我建议您首先尝试在事务中创建,并在完成/成功时重定向

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


另外,我建议在生产服务器上尝试,有时本地和生产上的行为可能会非常不同

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

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

谢谢。上下文内缓存的HTTP请求问题是有意义的。但是,将其转换为事务性操作并不能解决问题。如果我错了,请更正,但数据存储在写入磁盘之前会返回密钥。这就是为什么即使我得到一个键,当我得到它时,它返回一个非类型。我猜一个解决办法可能是将其内存缓存几秒钟。。。这是一个好的解决方案吗?阅读:它还说“因为数据存储get和祖先查询在执行之前应用了任何未完成的修改,所以这些操作总是看到以前所有成功事务的一致视图。这意味着get操作(通过其键查找更新的实体)“据我所知,在使用put生成的密钥执行get后,不应获取noneType。谢谢。我认为,对于“一致性”,GAE指的是系统中没有部分更新的数据。我认为这并不意味着在返回密钥时写入数据。我已经做了更多的测试,当我更新一个值并且不重定向到一个页面时,我会立即看到新的值(它来自上下文缓存)。但是,当我更新并重定向时,在第一个页面加载时,该值不会更新(由于您提到的HTTP请求问题)。只有当我重新加载(它有时间写入磁盘)时,我才会看到更新的值。这很奇怪,因为我经常重定向到用户刚刚创建的内容,并且它总是在那里。然后我建议明确地将内容放入memcache,并在下一次请求时再次将其取出,