0

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

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

由于实体很少更改,我想长时间缓存 GET 请求,比如说几天或几周。因此,在我获得更新实体的 POST 的罕见机会中,我可以清除内存缓存。

如果我处理一个 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-nonrel,django-tastypie 处理 GET 请求。

4

1 回答 1

0

根据我对 GAE 上的 memcache 的理解/经验,除非您驾驶的流量非常大,否则您的数据将被驱逐,但即便如此也不能保证

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

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

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

这是文档中的一个示例。

这是我问的一个相关问题,它展示了一些关于设置父级、键和易于查询的 ID 的好技巧:NDB using Users API to form an entity group

于 2012-12-10T03:17:14.913 回答