繁体   English   中英

Google App Engine高效的数据存储区读/写操作以节省配额

[英]Google App Engine Efficient Data store Read/Write Operation to Save Quota

我使用Python创建了一个Google App Engine应用。该应用处理许多用户名。

它有一个数据库以50K用户名。 每个用户名都有一个唯一的哈希值。 哪些也存储在数据存储中。

任何应用程序用户提交任何用户名。 应用程序首先检查用户名是否存在于数据库中。

如果应用程序使用新的用户名,则该应用程序将为新名称计算新的哈希,并将名称和哈希存储在DataStore中。

如果数据存储中已经存在用户名,它将从数据存储中检索旧哈希。

样例代码:

class Names(db.Model):
    name = db.StringProperty(required=True)
    hash = db.StringProperty(required=True)

username = "debasish"
user_db = db.GqlQuery("SELECT * FROM Names WHERE name=:1", username)
user = user_db.get()
if user == None:
    #doesn't exist in DB..so calculate new hash for that name and store it in DB
    e = Names(name=username,hash="badasdbashdbhasbdasbdbjasbdjbasjdbasbdbasjdbjasbd")
    e.put()
else:
    #retrieve the old hash.
    self.response.out.write('{"name":"'+user.name+'","hash":"'+user.hash+'"}')            

我面临的问题是GAE的免费数据存储读取操作配额,该配额过快并且我的应用程序停止运行。

我也曾尝试实现memcache,像这样,在memcache中添加整个数据库。 但这也是一个失败,结果更加糟糕。

def get_fresh_all(self):
    all_names = db.GqlQuery("SELECT * FROM Names")
    memcache.add('full_db', all_names, 3600)
    return all_names

所以,你们能不能建议我,我做错什么了吗? 如何使数据存储读取操作更有效?

感谢高级。

您可以:

  • 切换到自动缓存的NDB
  • 查询键而不是实体SELECT __key__ FROM ...
  • 减少相关索引(确保减少写操作,甚至可能减少读操作)
  • 使用用户名作为key_name重写所有实体,并使用方法get_or_insert()
user = Names.get_or_insert("debasish", hash="badasdbashdbhasbd")

您应该仅缓存用户名=哈希,而不是全部。 再加上一个内存缓存(这仅适用于每个实例缓存。应该有更多帮助,只需在全局模块级别上创建一个字典即可)。 根据您的独特点击数,它可能会迅速增长,但是您可以添加逻辑以仅保留某些数字。 这是一个示例:

cache = {}

def get_user_hash(username):
    if username in cache:
         return cache[username]
    hash = memcache.get(username)
    if not hash:
        hash = # retrieve from db
        if not hash:
            # put to db & assign hash=new_hash

        cache[username] = hash
        memcache.set(username, hash)
    return hash

@Faisal的方法应该可以正常工作,它为查询添加了两个缓存级别。

另一种选择是将用户名和哈希存储在会话中。 每个会话仅检查一次数据库,然后从会话变量中检索值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM