代码之家  ›  专栏  ›  技术社区  ›  fish2000

需要有关django中的中级/高级缓存、memcached和朋友的帮助

  •  2
  • fish2000  · 技术社区  · 15 年前

    所以:我总是部署我的django应用程序,同时运行memcached。就我而言,它们总是在同一个实例上运行。我正在用这些行启用缓存 settings.py :

    CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
    CACHE_MIDDLEWARE_SECONDS = 60
    CACHE_MIDDLEWARE_KEY_PREFIX = "the_name_of_the_app"
    SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
    

    …我可以清楚地看到运行memcache时的性能优势。但这是最简单的缓存策略,根据 the django docs on the subject --我应该从这里去哪里以获得更高的性能?你必须用memcache访问器手动挂起你的模型或查询集,还是有一种策略上更好的方法?

    我喜欢 memorized 我也有点运气,但在姜戈的缓存对我来说仍然是一个黑匣子。如果这是你熟悉的路,请告诉我前进的路。

    1 回复  |  直到 15 年前
        1
  •  2
  •   guidoism    15 年前

    Memcache不会让你的网站更快。你要做的第一件事就是找出什么是昂贵的。一种简单的方法是修饰视图或其他函数,以查看它们通常需要多长时间才能执行,例如:

    def print_latency(f):
        def wrapped(*args, **kwargs):
            try:
                start = time.time()
                r = f(*args, **kwargs)
            finally:
                print >>sys.stderr, 'Latency (%s): %.3fs' % (f.__name__, time.time() - start)
            return r
        wrapped.__name__ = f.__name__
        return wrapped
    
    @print_latency
    def my_view(request):
        ...
    

    下一步要做的是找出哪些资源是可缓存的,即哪些数据不会更改,或者如果更改不会导致可怕的体验?然后从顶部开始。你能缓存模板吗?如果没有,可以缓存视图吗?如果没有,可以缓存数据库调用吗?如果你没有一个超级简单的网站,后者很可能是你最终的归宿。

    然后,您将需要查看您对数据库的调用是否具有很强的可缓存性。您可能需要将复杂的查询分解为简单的查询。

    缓存不是魔法,也不是完美的。你可能有 更糟的 缓存延迟,但 更好的 吞吐量。或者平均来说,延迟可能更好,但最糟糕的延迟可能是可怕的。