我使用来自 GAE NDB 数据存储的最新 10 条记录生成 RSS 提要。数据库中的记录每周更新一次。每次用户请求显示 RSS 提要时,如何避免对数据存储的查询?即如何缓存它?
1 回答
您可以使用 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 内容并在渲染之前将其保存到内存缓存中。然后,当您更新它创建的内容时,只需使缓存版本无效(请参阅文档),以便下一个请求将从数据存储中获取它,然后您可以将其放回缓存中。