0

Currently I am working on project that's supposed to be used by a lot of people. I am worried that datastore read/write/small ops are using too much resources. Since I am new to appengine, are there any efficient ways to make those numbers smaller? I thought about using memcache but it's not most secure way. Also is it a good idea to search for datastore entities using the:

SELECT __key__ FROM table

then use:

....#code
table.get_by_id(entity.id())
....#code

?

Thank you very much.

4

4 回答 4

8

对于经常读取和不经常写入的数据,请使用数据存储前面的 memcache。读取时,首先检查数据是否在 memcache 中,如果没有,则从 datastore 中读取,然后将其存储在 memcache 中以供将来读取。在您通过键读取实体的简单情况下,您可以将每个实体按其数据存储键存储在内存缓存中。对于查询,您必须决定是否值得将结果集存储在 memcache 中,由查询参数键入。

写入时,您可以删除 memcache 值,并在下次读取时重新加载。您必须忍受删除失败的可能性。通常,您在 memcache 值上设置过期时间,以便旧值不会保留很长时间。请注意,对于每秒多次读取,即使是很短的过期时间也会让您获得显着的性能提升。

您还可以以同样的方式将 memcache 用于其他耗时的数据操作,如 URL Fetch 或计算值(例如复杂的模板文本)。在所有这些情况下,如果 memcache 值已被逐出,您将退回到主要来源,因此您可以获得读取性能而不会失去对数据的访问权限。

其他性能提示:尽可能使用批处理调用来减少 RPC 的数量。尽可能使用异步调用,这样您的应用程序就不会在可能执行其他操作时阻塞服务调用。使用 AppStats 可视化您的服务调用并找到异步调用可能有帮助的领域。

关于您的 fetch-by-key 问题:通常,执行仅键查询然后立即按键获取结果实体无济于事,因为这就是完整实体查询的全部内容。但是,如果您需要从查询结果中选择性地获取,或者如果在一个地方查询键并在另一个地方获取密钥是有意义的,那么这些都是可能的,并且您不会损失太多。我经常发现仅键查询的用途。另请参阅投影查询,仅获取(索引)属性的子集。

于 2012-06-05T17:22:05.697 回答
8

由于看起来您使用的是 python,因此我强烈建议您使用新的数据存储 API NDB

NDB 自动使用 memcache 在后台缓存它的模型,而无需您做任何额外的工作。当然,您还应该考虑手动使用 memcache,ndb 不是灵丹妙药。但它会免费为您提供帮助,这总是很好。

除了性能提升之外,它还是应用引擎数据存储的更简洁的界面。它还为批量操作提供了干净的支持,这也可以提高性能。

于 2012-06-05T18:20:13.510 回答
2

在 Google App Engine 中使用 Datastore 最有效的方法是……不使用 Datastore!它很慢。

尽可能使用内存缓存。什么是内存缓存“不安全”?这当然是一个不同寻常的批评。

此外,如果您知道实体的键或 ID,只需直接加载它,例如使用get_by_key_name

于 2012-06-05T17:02:34.897 回答
1

不,没有理由只进行键查询,然后单独获取实体,除非您只想检索由返回键标识的一些实体。如果这更有效,数据存储将为您完成。只需进行常规查询。

于 2012-06-07T03:13:22.367 回答