0

我使用来自 GAE NDB 数据存储的最新 10 条记录生成 RSS 提要。数据库中的记录每周更新一次。每次用户请求显示 RSS 提要时,如何避免对数据存储的查询?即如何缓存它?

4

1 回答 1

2

您可以使用 memcache 来避免每次都访问数据存储。您可能知道查询不会缓存在 NDB 中。

https://developers.google.com/appengine/docs/python/memcache/usingmemcache

def get_data():
  data = memcache.get('key')
  if data is not None:
      return data
  else:
      data = self.query_for_data()
      memcache.add('key', data, 60)
      return data

因此,换句话说,尝试从 memcache 中获取数据,如果失败,则从数据存储中获取数据,然后将其添加到 memcache 中以备下次使用。

上面的示例使用 60 秒超时(.add 调用中的值 60)只需保留该参数即可让数据在 memcache 允许的情况下持续存在。

也来自一个类似的问题:NDB Caching When Using Projected Queries

key.get() 将被缓存并从缓存中检索,但 query.get() 不会从缓存中检索。 https://developers.google.com/appengine/docs/python/ndb/cache

来自文档:查询不会在任何缓存中查找值。但是,如果缓存策略如此,查询结果将被写回上下文缓存(但永远不会写回 Memcache)。

因此,如果您通过密钥获取,您将自动从 NDB 缓存中获取(如果可用),但我没有亲自使用过。

因此,构建您的 RSS 内容并在渲染之前将其保存到内存缓存中。然后,当您更新它创建的内容时,只需使缓存版本无效(请参阅文档),以便下一个请求将从数据存储中获取它,然后您可以将其放回缓存中。

于 2012-10-01T16:42:54.527 回答