Python 帮助使用App Engine的框架';s最终一致性+;缓存

Python 帮助使用App Engine的框架';s最终一致性+;缓存,python,google-app-engine,google-cloud-datastore,eventual-consistency,Python,Google App Engine,Google Cloud Datastore,Eventual Consistency,我相信我有一个相当典型的用例,这对于最终的一致性是非常困难的。我想知道是否有人已经创建了python框架来帮助解决这个问题 我有一个GET请求,它对一组实体发出查询。它们很少更新。 我有一个一次更新一个实体的POST请求,更新实体会影响它们是否/如何出现在GET请求中 由于实体很少改变,我想将GET请求缓存很长一段时间,比如说几天或几周。因此,如果我有机会获得更新实体的帖子,我可以清除memcache 如果我处理一个POST请求、更新一个实体、清除缓存,然后很快就会收到一个GET请求,那么问题就

我相信我有一个相当典型的用例,这对于最终的一致性是非常困难的。我想知道是否有人已经创建了python框架来帮助解决这个问题

我有一个GET请求,它对一组实体发出查询。它们很少更新。 我有一个一次更新一个实体的POST请求,更新实体会影响它们是否/如何出现在GET请求中

由于实体很少改变,我想将GET请求缓存很长一段时间,比如说几天或几周。因此,如果我有机会获得更新实体的帖子,我可以清除memcache

如果我处理一个POST请求、更新一个实体、清除缓存,然后很快就会收到一个GET请求,那么问题就会出现,最终一致的数据存储查询可能会显示旧的查询结果,这些结果将在接下来的几天或几周内被memcached

与其简单地更新数据存储和清除缓存,我需要:

1. update the datastore
2. get the cached query
3. modify the cached query (with the proper sorting too!)
4. update the cache with the new modified query results (with a cas() operation)
这似乎是一个很常见的问题。是否有任何python框架可以帮助缓解这个问题

ndb没有帮助,因为数据存储查询绕过了所有缓存


如果有关系的话,我目前正在使用django Nonl,django tastypie处理GET请求。

根据我在GAE上使用memcache的理解/经验,您的数据将被逐出,除非您的流量非常大,但即使如此

但是,我认为您应该能够通过将查询的范围限制在实体组来使用,因为它们提供了很强的一致性。从文档中:

要获得高度一致的查询结果,需要使用 祖先查询将结果限制为单个实体组。这 之所以有效,是因为实体组既是一致性的单位,也是一致性的单位 交易性。所有数据操作都应用于整个组; 在整个实体完成之前,祖先查询不会返回其结果 该组是最新的。如果您的应用程序依赖于强一致性 对于某些查询的结果,您可能需要考虑这一点 设计数据模型时需要考虑的问题

假设您的GET请求与某种用户或其他可识别的“父级”绑定,或者您可以创建一个由该GET检索的所有实体共享的全局父级,那么您将能够使用该父级来检索强一致的发送


我问了一个相关的问题,它展示了设置父项、键和易于查询的ID的一些好技巧:

缓存查询是非常困难的-因为无法枚举或查询memcache,所以无法知道在一般情况下缓存哪些查询。我不认为有一种方法可以自动做到这一点:如果你想缓存查询,你必须根据具体情况来做。