处理memcache的模式在Django中缓存

时间:2009-12-04 02:00:44

标签: python django memcached

我有一个大型的Django项目,其中包含几个相互关联的项目,并且正在使用大量缓存。它目前有一个存储缓存辅助函数的文件。因此,例如,get_object_x(id)将检查此对象的缓存,如果不存在,请转到DB并从那里拉出并返回它,沿途缓存它。对于缓存对象组,遵循相同的模式,该文件也用于失效方法。

虽然应用程序之间的导入出现了问题。应用程序模型文件有许多我们想要使用缓存的辅助函数,而cache_helpers文件显然需要导入模型文件。

所以我的问题是:有什么更好的方法可以将代码暴露给循环导入问题(或者通常只是一种更聪明的方式)?理想情况下,我们也可以以更好,更少手动的方式进行失效。我的猜测是使用Django Custom Managers和Signals是最好的起点,完全摆脱cache_helpers文件,但是有没有人有更好的建议或方向去看哪里?

2 个答案:

答案 0 :(得分:7)

避免循环导入的一般Python模式是将一组导入放在依赖函数中:

# module_a.py
import module_b

def foo():
    return "bar"

def bar():
    return module_b.baz()

# module_b.py
def baz():
    import module_a
    return module_a.foo()

至于缓存,听起来你需要一个看起来像这样的函数:

def get_cached(model, **kwargs):
    timeout = kwargs.pop('timeout', 60 * 60)
    key = '%s:%s' % (model, kwargs)
    result = cache.get(key)
    if result is None:
        result = model.objects.get(**kwargs)
        cache.set(key, result, timeout)
    return result

现在您不需要为每个模型创建“getbyid”方法。你可以这样做:

blog_entry = get_cached(BlogEntry, pk = 4)

您可以使用.get()方法编写类似的函数来处理完整的QuerySets,而不只是单个模型对象。

答案 1 :(得分:3)

由于您表示正在缓存Django ORM模型实例,请查看django-orm-cache,它提供模型实例的自动缓存,并且知道何时使缓存无效。

您的循环导入不会成为问题 - 您需要做的就是从ormcache.models.CachedModel类而不是Django的django.db.models.Model扩展您需要缓存的模型,并且您可以免费获得缓存。“