2011-12-13 2 views
3

Я разработал сайт Django. Между образцами экземпляров в dabatase и страницами на сайте существует довольно много отношений 1 к 1.Могу ли я заставить кеш-сервер Django использовать только путь каждой страницы в качестве ключа?

Я хотел бы кэшировать каждую страницу на сайте (используя memcached как back-end для кэша). Сайт не слишком велик - в соответствии с калькуляцией на основе конверта, все это должно вписываться в довольно небольшой объем оперативной памяти - и данные не меняются особенно часто, поэтому весь сайт может эффективно жить в кеше.

Однако, когда данные меняются, я хочу, чтобы кеш отражал это сразу, поэтому в идеале я хотел бы, чтобы каждый экземпляр модели мог очистить свою собственную страницу из кэша при сохранении.

То, как я себе представлял, я бы это сделал, чтобы кэшировать страницы со своим URL-адресом в качестве ключа. Затем каждый экземпляр модели может использовать свой URL (который он знает через get_absolue_url()), чтобы очистить свою страницу от кеша.

Можно ли использовать механизм кэширования Django для каждого сайта в качестве ключа кеша?

ответ

2

Я не знаю никакой опции для управления ключом кеша, а реализация в Django не предполагает наличия каких-либо. Код для генерации ключа кэша для запроса через промежуточное программное обеспечение кэша живет в django.utils.cache.get_cache_key (чтобы узнать, где извлечь из кеша) и learn_cache_key (чтобы узнать, где установить кеш). Вы можете обезьяний залатать эти функции не принимать заголовки во внимание, как это:

from django.utils import cache 
from django.conf import settings 

def get_path_cache_key(request, key_prefix=None): 
    if key_prefix is None: 
     key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX 
    return cache._generate_cache_key(request, [], key_prefix) 
    # passing an empty headerlist so only request.path is taken into account 

cache.get_cache_key = get_path_cache_key 
cache.learn_cache_key = get_path_cache_key 

Это будет внутренне принять MD5 хэш пути, добавить потенциальный префикс, а также взять на себя текущую локаль (язык) во внимание , Вы можете изменить его, чтобы опустить префикс и язык. Я бы не рекомендовал использовать простой путь без его хэширования, так как memcached не позволяет ключам длиной более 250 символов или содержать пробелы в соответствии с documentation. Это не должно быть проблемой, потому что вы можете просто применить get_path_cache_key к URL-адресу от get_absolute_url(), а также очистить эту страницу.

+0

Aha! Gotcha - отличное исследование, большое спасибо. –