Python 使用memcache覆盖按\u键\u name()获取\u
用另一个使用memcache保存数据库查询的函数覆盖get_by_key_name有意义吗?像下面这样?在本例中,memcache键仅包含实体键\u名称,以使其简单Python 使用memcache覆盖按\u键\u name()获取\u,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,用另一个使用memcache保存数据库查询的函数覆盖get_by_key_name有意义吗?像下面这样?在本例中,memcache键仅包含实体键\u名称,以使其简单 class Entity(db.Model): @classmethod def get_by_key_name(cls, key_name): entity = memcache.get(key_name) if entity is not None: return entity
class Entity(db.Model):
@classmethod
def get_by_key_name(cls, key_name):
entity = memcache.get(key_name)
if entity is not None:
return entity
else:
entity = cls.__super__.get_by_key_name(key_name)
memcache.add(key_name, entity, 3600)
return entity
它是否有意义取决于:
至于您建议的实现,它看起来并不不合理,因为
get\u by\u key\u name()
已经是一个类方法。您可以尝试将新方法直接注入现有的Model
类(或者将整个子类替换回模块),这样就不需要更改任何使用Model
的代码。但这也有其自身的危险。当然,你所拥有的足够好,你可以做一些测试,看看它是否真的有用。它是否有意义取决于:
至于您建议的实现,它看起来并不不合理,因为
get\u by\u key\u name()
已经是一个类方法。您可以尝试将新方法直接注入现有的Model
类(或者将整个子类替换回模块),这样就不需要更改任何使用Model
的代码。但这也有其自身的危险。当然,你所拥有的足够好,你可以做一些测试,看看它是否真的有帮助。我也使用memcache来缓存实体,我认为加速数据库操作是个好主意。
我选择向类模型添加一个get_key方法,因为memcache/datastore代理可以在许多类中重用
定义通用memcache db代理
#mydb.py
def get_cache(keys):
""" not support async operation
because Async operation conflict with cache logiclly
"""
if not isinstance(keys, list) and not isinstance(keys, tuple):
keys = [keys]
keys = [str(k) for k in keys]
results = memcache.get_multi(keys) #@UndefinedVariable
keys_not_in_cache = [k for k in keys if k not in results]
if keys_not_in_cache:
values = db.get([db.Key(k) for k in keys_not_in_cache])
results_from_db = dict(zip(keys_not_in_cache, values))
results.update(results_from_db)
memcache.set_multi(results_from_db) #@UndefinedVariable
return [results[k] for k in keys]
def put_cache(values):
""" Not support async operation
"""
if not isinstance(values, list):
values = [values]
db.put(values)
keys_str = [(str(k.key()), k) for k in values]
memcache.set_multi(dict(keys_str)) #@UndefinedVariable
def delete_cache(values):
""" Not Support Async Operation
"""
if not isinstance(values, list):
values = [values]
db.delete(values)
keys_str = [str(k.key()) for k in values]
memcache.delete_multi(keys_str) #@UndefinedVariable
用法示例
# for the class want to use this feature
class User(db.Model):
email = db.EmailProperty()
@classmethod
def get_key(cls, email):
return db.Key.from_path(cls.__name__, email)
# Using memcache db proxy
user_keys = [User.get_key(USER_EMAIL_ADDRESS) for USER_EMAIL_ADDRESS in ALL_USER_EMAIL_ADDRESS]
users = mydb.get_cache(user_keys)
我也使用memcache来缓存实体,我认为加速数据库操作是个好主意。 我选择向类模型添加一个get_key方法,因为memcache/datastore代理可以在许多类中重用 定义通用memcache db代理
#mydb.py
def get_cache(keys):
""" not support async operation
because Async operation conflict with cache logiclly
"""
if not isinstance(keys, list) and not isinstance(keys, tuple):
keys = [keys]
keys = [str(k) for k in keys]
results = memcache.get_multi(keys) #@UndefinedVariable
keys_not_in_cache = [k for k in keys if k not in results]
if keys_not_in_cache:
values = db.get([db.Key(k) for k in keys_not_in_cache])
results_from_db = dict(zip(keys_not_in_cache, values))
results.update(results_from_db)
memcache.set_multi(results_from_db) #@UndefinedVariable
return [results[k] for k in keys]
def put_cache(values):
""" Not support async operation
"""
if not isinstance(values, list):
values = [values]
db.put(values)
keys_str = [(str(k.key()), k) for k in values]
memcache.set_multi(dict(keys_str)) #@UndefinedVariable
def delete_cache(values):
""" Not Support Async Operation
"""
if not isinstance(values, list):
values = [values]
db.delete(values)
keys_str = [str(k.key()) for k in values]
memcache.delete_multi(keys_str) #@UndefinedVariable
用法示例
# for the class want to use this feature
class User(db.Model):
email = db.EmailProperty()
@classmethod
def get_key(cls, email):
return db.Key.from_path(cls.__name__, email)
# Using memcache db proxy
user_keys = [User.get_key(USER_EMAIL_ADDRESS) for USER_EMAIL_ADDRESS in ALL_USER_EMAIL_ADDRESS]
users = mydb.get_cache(user_keys)
缓存的想法很好(尽管其他人已经表明,您必须小心无效)。但是,我不会重写get_by_name()来执行此操作。我将编写单独的函数来处理缓存,这样代码的读者就可以清楚地看到您没有使用标准的get_by_name()。还要注意的是,get_by_name()是get()之上的一个非常薄的层,带有一个键对象——您可能也应该提供该API。缓存的想法很好(尽管其他人已经表明,您必须小心无效)。但是,我不会重写get_by_name()来执行此操作。我将编写单独的函数来处理缓存,这样代码的读者就可以清楚地看到您没有使用标准的get_by_name()。还要注意的是,get\u by\u name()是get()之上的一个非常薄的层,带有一个关键对象——您可能也应该提供该API。更好、更整洁的解决方案是使用它,它内置了对memcache和实例内存缓存的支持。更好、更整洁的解决方案是使用,它内置了对memcache和实例内存缓存的支持。
cls.\uuuu super\uuuu.get\u by\u key\u name
拼写正确super(实体,cls)。get\u by\u key\u name
。好心的家伙们,很快就完成了。如果没有什么