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

#django #django-cache #django-caching

#django #django-cache #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)? В документации не упоминается, как это сделать.

Ответ №1:

 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 
  

Ответ №2:

Начиная с Django 1.9, get_cache устарел. Выполните следующие действия для обращения к ключам из ‘inmem’ (дополнение к ответу римлянами):

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

Ответ №3:

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

 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')
  

Ответ №4:

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

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

Ответ №5:

Создайте служебную функцию с именем 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)
  

Ответ №6:

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

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

 DEFAULT_CACHE_ALIAS = 'default'
  

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