2010-11-13 42 views
2

所以:我总是部署我的Django应用程序,同时运行memcached。为了我的目的,他们总是在同一个实例上运行。我能够与这些线缓存settings.py需要django中的中级/高级缓存帮助,以及memcached和朋友

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" 

...我可以清楚地看到性能优势,当内存缓存运行。但根据the django docs on the subject,这是最简单的缓存策略 - 我应该从哪里去获得更多性能?是否必须手动使用memcache访问器对一个模型或查询集进行花花公子,或者是否有策略上更好的方法?

我喜欢memorized,并且有一些运气 - 但在django缓存仍然是一个黑盒子给我。请告诉我前进的方向,如果这是你熟悉的道路。

+0

如果您想了解为什么增加缓存性能是一个目标,这将会很有帮助。例如。你遇到什么样的性能问题,你寻求什么样的改进,多少工程努力是你的改进。 – 2010-12-09 18:38:00

回答

2

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): 
    ... 

接下来要做的是找出哪些资源缓存,即什么数据不会改变,或者如果它没有造成可怕的经历?然后从顶部开始。你能缓存模板吗?如果没有,你能缓存视图吗?如果不是,你可以缓存数据库调用吗?后者可能是你最终会去的地方,除非你有一个超级简单的网站。

然后,你需要看看你的db调用是否非常缓存。您可能需要将复杂的查询分解为更简单的查询。

缓存并不神奇,并不完美。你可能有更糟糕延迟与缓存但更好吞吐量。或者平均延迟可能会更好,但最糟糕的延迟可能会很糟糕。