当前位置:  开发笔记 > 编程语言 > 正文

处理memcache的模式在Django中缓存

如何解决《处理memcache的模式在Django中缓存》经验,为你挑选了1个好方法。

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

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

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



1> Simon Willis..:

用于避免循环导入的一般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()方法编写类似的函数来处理完整的QuerySet而不是单个模型对象.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有