Как использовать 2 разных кеша в Django?

Мне нужно использовать memcached и файловый кеш. Я настраиваю свой кеш в настройках:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': 'c:/foo/bar',
    },
    'inmem': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}

пустышка временная. Документы говорят:

cache.set('my_key', 'hello, world!', 30)
cache.get('my_key')

Хорошо, но как я могу теперь установить и получить кеш только для внутреннего кэша inmem (в будущем memcached)? Документация не упоминает, как это сделать.

6 ответов

Решение
CACHES = {
  'default': {
    'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
    'LOCATION': 'c:/foo/bar',
  },
  'inmem': {
    'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
  }
} 

from django.core.cache import get_cache, cache
inmem_cache = get_cache('inmem')
default_cache = get_cache('default')
# default_cache == cache 

С Джанго 1,9, get_cache устарела. Выполните следующие действия, чтобы обратиться к ключам от "inmem" (дополнение к ответу римлян):

from django.core.cache import caches
caches['inmem'].get(key)

В дополнение к ответу римлян выше... Вы также можете условно импортировать кеш по имени и использовать заданный по умолчанию (или любой другой кеш), если запрошенный не существует.

from django.core.cache import cache as default_cache, get_cache
from django.core.cache.backends.base import InvalidCacheBackendError

try:
    cache = get_cache('foo-cache')
except InvalidCacheBackendError:
    cache = default_cache

cache.get('foo')

Из документов:

>>> from django.core.cache import caches
>>> cache1 = caches['myalias']
>>> cache2 = caches['myalias']
>>> cache1 is cache2
True

Создайте вспомогательную функцию с именем get_cache. Метод get_cache, на который ссылаются в других ответах, не существует в библиотеке django.core.cache в некоторых версиях django. Вместо этого используйте следующее

      from django.utils.connection import ConnectionProxy
from django.core.cache import caches

def get_cache(alias):
  return ConnectionProxy(caches, alias)


cache = get_cache('infile')
value = cache.get(key)

К сожалению, вы не можете изменить, какой псевдоним кэша используется для низкоуровневого cache.set() а также cache.get() методы.

Эти методы всегда используют кэш по умолчанию согласно строке 51 (в Django 1.3) django.core.cache.__init__.py:

DEFAULT_CACHE_ALIAS = 'default'

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

Другие вопросы по тегам