Благодаря @ rdegotiations я смог найти отличный способ сделать это.
Я придерживаюсь этой парадигмы:
- Кэш визуализированфрагменты шаблона и вызовы API в течение пяти минут (или дольше)
- При каждом добавлении новых данных кеш становится недействительным.
- Простая аннулирование кэша лучше, чем повторное сохранение при сохранении, поскольку новые кэшированные данные генерируются автоматически и органически, когда кэшированные данные не обнаруживаются.
- Вручную аннулировать кэш послеЯ сделал полное обновление (скажем, из поиска в твиттере), но не для каждого объекта.
- Преимущество этого заключается в том, что кэш-память становится недействительной несколько раз, но с другой стороны это не так автоматически.
Вот весь необходимый кодчтобы сделать это следующим образом:
from django.conf import settings
from django.core.cache import get_cache
from django.core.cache.backends.memcached import MemcachedCache
from django.utils.encoding import smart_str
from time import time
class NamespacedMemcachedCache(MemcachedCache):
def __init__(self, *args, **kwargs):
super(NamespacedMemcachedCache, self).__init__(*args, **kwargs)
self.cache = get_cache(getattr(settings, 'REGULAR_CACHE', 'regular'))
self.reset()
def reset(self):
namespace = str(time()).replace('.', '')
self.cache.set('namespaced_cache_namespace', namespace, 0)
# note that (very important) we are setting
# this in the non namespaced cache, not our cache.
# otherwise stuff would get crazy.
return namespace
def make_key(self, key, version=None):
"""Constructs the key used by all other methods. By default it
uses the key_func to generate a key (which, by default,
prepends the `key_prefix' and 'version'). An different key
function can be provided at the time of cache construction;
alternatively, you can subclass the cache backend to provide
custom key making behavior.
"""
if version is None:
version = self.version
namespace = self.cache.get('namespaced_cache_namespace')
if not namespace:
namespace = self.reset()
return ':'.join([self.key_prefix, str(version), namespace, smart_str(key)])
Это работает, устанавливая версию или пространство имен для каждой кэшированной записи и сохраняя эту версию в кеше .Версия - это просто текущее время эпохи, когда вызывается reset()
.
Вы должны указать свой альтернативный кэш без пространства имен с помощью settings.REGULAR_CACHE
, чтобы номер версии можно было сохранить в кеше без пространства имен (чтобы он не становился рекурсивным!).
Всякий раз, когда вы добавляете кучу данных и хотите очистить кеш (при условии, что вы установили этот один как default
кеш), просто выполните:
from django.core.cache import cache
cache.clear()
Вы можете получить доступ к любомукеш с:
from django.core.cache import get_cache
some_cache = get_cache('some_cache_key')
Наконец, я рекомендую не помещать свою сессию в этот кеш.Вы можете использовать этот метод, чтобы изменить ключ кэша для вашего сеанса.(Как settings.SESSION_CACHE_ALIAS
).