目前我正在研究应该被很多人使用的项目。我担心数据存储区读/写/小操作使用了太多资源。由于我是appengine的新手,有没有什么有效的方法可以缩小这些数字?我想过使用memcache,但这不是最安全的方式。使用以下方法搜索数据存储区实体也是个好主意:
SELECT __key__ FROM table
然后使用:
....#code
table.get_by_id(entity.id())
....#code
非常感谢。
答案 0 :(得分:8)
对于经常读取和写入频率不太频繁的数据,请使用数据存储区前面的内存缓存。阅读时,首先检查数据是否在memcache中,如果没有,请从数据存储区读取数据,然后将其存储在memcache中以备将来读取。在您按键读取实体的简单情况下,您可以通过其内存缓存中的数据存储键存储每个实体。对于查询,您必须决定是否值得将结果集存储在memcache中,并以查询参数为键。
编写时,可以删除memcache值,并在下次读取时重新加载。你必须忍受删除失败的可能性。通常,您在memcache值上设置过期时间,因此旧值不会持续很长时间。请注意,对于每秒多次读取,即使很短的到期时间也会显着提高性能。
您也可以使用memcache与其他耗时的数据操作(如URL Fetch)或计算值(例如复杂的模板文本)一样使用。在所有这些情况下,如果已逐出memcache值,则会回退到主要源,因此您可以获得读取性能而不会失去对数据的访问权。
其他性能提示:尽可能使用批量调用来减少RPC的数量。尽可能使用异步调用,这样当应用程序执行其他操作时,您的应用程序不会阻止服务调用。使用AppStats可视化您的服务调用,并找到异步调用可能有帮助的区域。
关于你的按键获取问题:通常,执行仅键查询然后立即按键获取结果实体没有帮助,因为无论如何这都是完整实体查询。但是如果你需要从查询结果中有选择地获取,或者如果在一个地方查询密钥并在另一个地方获取密钥是有意义的,那么这些都是可能的,并且你不会损失太多。我经常发现仅用于键的查询。另请参见投影查询,仅用于获取(索引)属性的子集。
答案 1 :(得分:8)
由于您看起来使用的是python,我强烈建议您使用新的数据存储API NDB。
NDB自动使用memcache在幕后缓存它的模型,而无需你做任何额外的工作。当然,你也应该看看手动使用memcache,ndb不是银弹。但它会免费帮助你,这总是很好。
除了性能提升之外,它还是应用引擎数据存储区的更清晰的界面。它还为bulk operations提供了干净的支持,这也可以提升性能。
答案 2 :(得分:2)
最有效的想要在Google App Engine中使用数据存储区是......不使用数据存储区!这很慢。
尽可能使用memcache。关于memcache的“不安全”是什么?这当然是一种不寻常的批评。
此外,如果您知道实体的密钥或ID,只需直接加载,例如与get_by_key_name。
答案 3 :(得分:1)
不,没有理由只进行密钥查询,然后单独获取实体,除非您只想检索返回密钥标识的某些实体。如果这更有效,数据存储区将为您完成。只需定期查询。