Skip to content

Кэширование

SLOzy реализует двухуровневое кэширование результатов Prometheus-запросов. Это снижает нагрузку на Prometheus и базу данных, ускоряя загрузку дашбордов и страниц SLO.

Архитектура

Приложение → Memory Cache (sync.Map) → PostgreSQL (query_cache / Redis)

Сервис сначала проверяет in-memory кэш. При непападании в кэш выполняется запрос к PostgreSQL (или Redis). «Горячие» записи (с частыми обращениями) продвигаются обратно в память при повторных чтениях.

Структура кэша

Таблица query_cache (миграция 000018):

КолонкаТипНазначение
cache_keyVARCHAR(500) UNIQUEquery:{slo_id}:{time_window}:{sha256}
query_hashVARCHAR(64)SHA256 от запроса + параметров
resultJSONBЗакэшированный результат Prometheus
expires_atTIMESTAMPTZTTL-истечение
hit_countINTEGERЧастота обращений
is_freshBOOLEANСвежие или устаревшие данные

UI-страница (localhost:3000/cache)

Страница Cache Management в боковом меню показывает:

  • Cache Performance — карточки со статистикой: всего записей, Hit Rate (доля попаданий), Memory Usage (MB), свежие записи
  • Cache Operations — кнопки «Invalidate Expired» и «Invalidate All» для сброса кэша
  • Cache Entries — таблица закэшированных запросов: SLO ID, query, время создания/истечения, hit count
  • Cache Configuration — текущие настройки (TTL, лимит записей, интервал очистки, сжатие)

Как работает в compose-стеке

По умолчанию (без Redis) кэш хранится в PostgreSQL. Сервис инициализируется при старте slozy-web. Настройки по умолчанию:

  • Default TTL: 5 минут
  • Max Entries: 10 000
  • Cleanup Interval: 1 минута
  • Сжатие: gzip для результатов > 1 KB

API-эндпоинты

Все под /api/v1/cache/ (не /admin/cache/):

EndpointОписание
GET /statisticsМетрики производительности кэша
GET /configТекущая конфигурация (только чтение)
PUT /configОбновление конфигурации (TTL, maxEntries, сжатие)
GET /entriesПагинированный список записей
GET /entry/:keyОдна запись по ключу
POST /entryСоздать запись вручную
DELETE /entry/:keyУдалить запись
POST /invalidateИнвалидация (type: expired, all, key, slo, pattern)
POST /warmupПредзагрузка кэша

Инвалидация

Кэш автоматически инвалидируется при изменении SLO (обновление метрики, цели, временного окна). На странице Cache Management accessible ручная инвалидация:

bash
curl -X POST http://localhost:8080/api/v1/cache/invalidate \
  -H "Content-Type: application/json" \
  -d '{"type": "expired"}'

Когда наполнится кэш

Кэш пуст после старта. Первые запросы к Dashboard и страницам SLO будут промахами (misses). После 2–3 открытий страниц в течение 5 минут hit rate начнёт расти.