Redis Cache и Session
Когда использовать
Используйте эти бэкенды, когда проекту нужен Redis-бэкенд для Django-сессий и
основного кэша без pickle и без зависимости django-redis. Стек строится
поверх codex-platform / codex-django и совместим с остальными Redis-менеджерами проекта.
Минимальная настройка
# settings.py (production / staging)
REDIS_URL = env("REDIS_URL", default="redis://localhost:6379/0")
PROJECT_NAME = "myproject"
CACHES = {
"default": {
"BACKEND": "codex_django.cache.backends.redis.RedisCache",
"LOCATION": REDIS_URL,
"KEY_PREFIX": PROJECT_NAME, # обязательно — используется в clear()
"TIMEOUT": 300,
}
}
SESSION_ENGINE = "codex_django.sessions.backends.redis"
SESSION_COOKIE_NAME = f"sessionid_{PROJECT_NAME}"
SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer"
RATELIMIT_USE_CACHE = "default" # django-ratelimit работает без изменений
SESSION_CACHE_ALIAS больше не нужен — session backend подключается к Redis
напрямую, а не через cache framework.
Справочник настроек
| Настройка | По умолчанию | Примечание |
|---|---|---|
CACHES["default"]["KEY_PREFIX"] |
"" |
Обязательно. Область видимости для clear(). |
CACHES["default"]["TIMEOUT"] |
300 |
TTL в секундах по умолчанию. |
CACHES["default"]["OPTIONS"]["SERIALIZER"] |
JsonSerializer |
Dotted path к пользовательскому классу. |
CODEX_SESSION_REDIS_URL |
settings.REDIS_URL |
Переопределяет URL Redis только для сессий. |
CODEX_SESSION_KEY_PREFIX |
"session" |
Средний сегмент Redis-ключа сессии. |
Структура ключей:
{PROJECT_NAME}:{CODEX_SESSION_KEY_PREFIX}:{session_key} # сессии
{KEY_PREFIX}:{VERSION}:{cache_key} # кэш
Переопределения для dev и test
# settings/dev.py
CACHES = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}}
SESSION_ENGINE = "django.contrib.sessions.backends.db"
# settings/test.py
CACHES = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}}
Политика no-pickle
Ни один из бэкендов не использует pickle:
- Сессии хранятся как Django encoded string — подписанная JSON-строка,
сгенерированная
SessionBase.encode(). - Кэш хранит строгий JSON через
JsonSerializer. Попытка сохранить значение, которое нельзя закодировать (datetime,Decimal,setи т. д.), вызываетTypeErrorнемедленно.
Для нестандартных типов используйте codex_django.cache.values.CacheCoder:
from codex_django.cache.values import CacheCoder
from django.core.cache import cache
cache.set("user:42:last_seen", CacheCoder.dump_datetime(user.last_seen), 3600)
raw = cache.get("user:42:last_seen")
last_seen = CacheCoder.load_datetime(raw) if raw else None
CacheCoder также поддерживает date, timedelta, Decimal, UUID, set,
bytes и рекурсивный CacheCoder.dump() для вложенных структур.
clear() работает в пределах namespace
cache.clear() делает SCAN + DEL по маске {KEY_PREFIX}:*. Команда
FLUSHDB никогда не выполняется. Если KEY_PREFIX пуст, clear()
вызывает ImproperlyConfigured вместо очистки неограниченного пространства.
Поведение при сбое Redis
Оба бэкенда пробрасывают RedisConnectionError и RedisServiceError без
перехвата — нет тихого fallback, нет пустой сессии при недоступности Redis,
нет обхода через CODEX_REDIS_ENABLED.
Миграция с django-redis
- Замените
BACKENDна"codex_django.cache.backends.redis.RedisCache". - Удалите
OPTIONS["CLIENT_CLASS"]. - Замените
SESSION_ENGINEна"codex_django.sessions.backends.redis". - Удалите
SESSION_CACHE_ALIAS. - Старые pickled-данные не читаются — сессии сбросятся при переключении.
- После проверки удалите
django-redisиз зависимостей проекта.
Точки входа
codex_django.sessions.backends.redis.SessionStorecodex_django.cache.backends.redis.RedisCachecodex_django.cache.serializers.JsonSerializercodex_django.cache.values.CacheCoder
Связанные разделы
- Архитектура: Redis Cache и Session Layer