我使用Python创建了一个Google App Engine应用程序。该应用程序处理许多用户名。
它有一个50K用户名的数据库。每个用户名都有一个唯一的哈希值。它也存储在数据存储中。
当任何应用用户提交任何用户名时。应用程序首先检查DB中是否存在用户名。
如果是新用户名,则应用程序为新名称计算新哈希值,并将名称和哈希值存储在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中添加整个db。但这也是失败,结果更糟糕。
def get_fresh_all(self):
all_names = db.GqlQuery("SELECT * FROM Names")
memcache.add('full_db', all_names, 3600)
return all_names
所以,伙计们,请你建议,我做错了什么? 如何更有效地使数据存储读取操作?
感谢Adv。
答案 0 :(得分:3)
SELECT __key__ FROM
... user = Names.get_or_insert("debasish", hash="badasdbashdbhasbd")
答案 1 :(得分:0)
您应该只缓存username = hash而不是all。另外,添加一个内存缓存(这个实例只适用于缓存。应该更多,只需在全局模块级别创建一个dict)。根据您的独特命中,这可能会非常快速地增长,但您可以添加逻辑以仅保留特定数字。这是一个示例:
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
答案 2 :(得分:0)
@Faisal的方法应该运行良好,它为查询添加了两级缓存。
另一种选择是在会话中存储用户名和哈希值。仅在每个会话中检查一次数据库,然后从会话变量中检索值。