CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } }, 'heavylift': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': os.path.join(BASE_DIR, 'django_cache'), } }
Задача в следующем. Для “легкого” кеша изначально нужно указать флаг, что мол “Идёт подготовка данных”.
Так вот, нужно, чтобы вьюху проверяла, если “подготовка данных не идёт” (если кеш пуст) - проверять “тяжёлый” кеш. Если и он пуст, запускать асинхронную задачу.
Если же кеш не пуст, то просто прекращать работу функции.
TTL = 60 минут.
Вот, до какого алгоритма пришёл, но что-то мне подсказывает, что это совсем не то. Подправьте, пожалуйста, кто знает. А то в интернете толковый пример сложно найти.
@cache_page(60 * 60) def user_data_view(request): cache1 = caches['default'] #Прирывниваем легкий кеш к cache1 cache2 = caches['heavylift'] #Прирывниваем тяжёлый кеш к cache2 cache1.set('my_key', 'Идёт подготовка данных') #Получаем данные из "легкого" кеша, или None (если он пуст) if cache1.get('my_key', None) == None: #Если "легкий" кеш пуст, проверяем heavylift #Получаем данные из "тяжёлого" кеша, или None (если он пуст) if cache2.get('heavylift', None) == None: #Если "тяжёлый" кеш пуст, запускаем асинхронную задачу. Что если он не пуст? #Запуск асинхронной задачи else: #Если "легкий" кеш не пуст - прекращаем работу return
P.S. Django 1.11, Python 2.7.