Как это работает
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расшифровывается только в памяти.
Fallback к чтению одной строки из БД нет. У ключей нет TTL. Актуальность даёт полный refresh, а не истечение.
Когда обновляется снимок
- синхронный cache miss
post_saveуGlobalConfigчерезtransaction.on_commit()post_migrateпосле инициализации- необязательная Celery-задача
django_gc.refresh_global_configs_cache
Инициализация подавляет per-row refresh и планирует один refresh после commit.
Строки хранятся в явных таблицах global_configs и global_config_categories.