Как это работает
Runtime-код читает значения только через get_value(). ORM-чтение одного ключа, свои cache-aside ключи и доменные fallback в пакет не входят.
Контракт чтения
- Прочитать
global-config:{key}из Django cache. - Принять только
GlobalConfigCacheValueDTO. Старые нетипизированные записи — miss. - При miss ждать
global-config:refresh-lock. - После захвата lock повторно проверить запрошенный ключ.
- Если другой процесс не опубликовал снимок, прочитать все строки
GlobalConfig. - Остановиться, если отсутствует любой объявленный ключ.
- Разобрать весь снимок. Ошибка одного значения отменяет публикацию.
- Опубликовать значения и маркер готовности через
set_many, пока lock принадлежит процессу. - Вернуть запрошенный ключ.
SECUREрасшифровывается только в памяти.
В get_value() нет fallback к чтению одной строки из БД. У ключей нет TTL. После commit сохранённый ключ обновляется точечно; полный refresh отвечает за восстановление после cache miss и периодическую сверку.
Когда обновляется снимок
- синхронный cache miss
- точечный refresh сохранённого ключа после
post_saveчерезtransaction.on_commit() post_migrateпосле инициализации- необязательная Celery-задача
django_gc.refresh_global_configs_cache
Инициализация подавляет per-row refresh и планирует один полный refresh после commit.
Строки хранятся в явных таблицах global_configs и
global_config_categories. Таблица категорий содержит только числовые
идентификаторы, а подписи для Admin берутся из project definitions.