Кеширование данных

Описание настройки

С версии 3.10 ВП "Дашборды" реализован новый механизм кеширования данных на уровне объектов. Этот механизм позволяет ускорить загрузку дашбордов, снизить нагрузку на сервер, при этом корректно учитывать примененные фильтры.

Механизм кеширования виджетов

Кеширование данных реализовано на основе алгоритма LRU (Least Recently Used) — "наименее недавно использованный". При переполнении кеша система удаляет записи, которые дольше всего не использовались, освобождая место для новых.

Основные принципы работы:

  • Хранение результатов — при построении виджета с конкретным набором параметров (включая фильтры) результат сохраняется для повторного использования.
  • Проверка наличия данных — при запросе система ищет кешированное значение и возвращает его без повторного построения.
  • Ограничение объема кеша — максимальное число записей задается в настройках параметром "Количество объектов в кеше" (maxCacheItems).
  • Удаление устаревших записей — при переполнении применяется принцип LRU: сохраняются самые новые записи, старые удаляются.
  • Ограничение по времени построения (timeLimitForCa) — задает максимальное время, за которое должен быть построен виджет, чтобы его результат был сохранен в кэше. Чем ниже пороговое значение, тем больше виджетов потенциально попадает в кеш, что способствует ускорению загрузки дашбордов. Ресурсоемкие виджеты, время построения которых превышает лимит, исключаются из кеширования, чтобы не перегружать систему.

Особенности работы:

  • Кеш не редактируется вручную.
  • Число объектов кеша может временно превышать "Количество объектов в кеше" (maxCacheItems) и составлять не более maxCacheItems + количество одновременно строившихся виджетов.
  • Поиск кешированного значения выполняется на основе значений атрибутов:

    • "Код виджета" (widgetKey).
    • "Язык" (sLocale). Если текущий пользователь не суперпользователь.
    • "Смещение между серверным и пользовательским ЧП" (iOffset). Если текущий пользователь не суперпользователь.
    • "Фильтры" (filtersIds)
    • "subjectUUID" (subjectUUID). При наличии относительного критерия в любом фильтре (дашборда, виджета, пользовательского).
    • "Название" (title).
  • "Название" (title) состоит из значений "Код виджета" (widgetKey), "UUID субъекта" (subjectUUID), "Язык" (sLocale), "Смещение между серверным и пользовательским ЧП" (iOffset), объединенных через символ "_".

Если результат построения виджета должен попасть в кеш, то перед записью нового результата выполняется проверка и очистка по принципу LRU:

  • Если механизм уже выполняется другим потоком, то выполнение механизма LRU будет пропущено
  • Будет выполнен поиск объектов "Кеш" (cache) с сортировкой по дате создания (от нового к старому)
  • В кеше остаются только самые новые записи в количестве указанном в "Количество объектов в кеше" (maxCacheItems), остальные удаляются.

Настройки механизма кеширования в интерфейсе администратора

  1. Создайте класс с кодом DBDashboards для хранения параметров отображения и кеширования данных для виджетов.

    Добавьте в него следующие атрибуты:

    Атрибут Код Тип Описание
    Значение tValue Текст Значение, представляющее данные виджета
    Смещение между серверным и пользовательским часовым поясом iOffset Целое число Разница во времени между сервером и клиентом, используется для корректного отображения даты/времени
    Код виджета widgetKey Текст Уникальный ключ, идентифицирующий виджет
    Язык sLocale Строка Языковой контекст, в котором отображается виджет
    Количество объектов в кеше maxCacheItems Целое число Ограничение на количество кешируемых значений. По умолчанию – 100
    Время построения виджета для попадания в кеш (сек.) timeLimitForCa Целое число

    Максимальное время (в секундах) на построение данных, при превышении кеш не используется.

    Рекомендуемое (базовое) значение - 10с на виджет.

    По умолчанию – 0

    Кеш включен cacheEnabled Логический Признак включения механизма кеширования
    Дата последнего чтения dateRead Дата/время Время последнего чтения или обновления кеша
    UUID субъекта subjectUUID Строка Идентификатор текущего субъекта
    Время жизни кеша cacheLifeTime Временной интервал Максимальное время хранения данных в кеше
    Фильтры filtersIds Текст Представление фильтров, примененных к виджету. По умолчанию – 24 часа
  2. В классе создайте типы объектов:

    • cache — представляет собой структуру хранения закешированных данных;
    • settings — представляет собой настройки дашбордов.
  3. Перейдите в раздел "Настройка системы" → "Консоль" и создайте объект:

    Copy
    utils.create('DBDashboards$settings', [title: 'Настройки дашбордов']).UUID
  4. Перейдите в раздел "Настройка системы" → "Администрирование" → вкладка "Управление логом событий" и создайте правило: не хранить логи по кешам дашбордов (для объектов данного типа логи не создаются).

    Подробнее о настройке правил описано в статье Настройка правила хранения лога событий.

Включение механизма кеширования в интерфейсе оператора

  1. В интерфейсе оператора перейдите на вкладку с параметрами дашбордов.
  2. Нажмите Редактировать, на форме редактирования установите флажок "Включить кеш" и нажмите кнопку Сохранить.

После включения механизма кеширования:

  • данные виджетов сохраняются и повторно используются при обращении;
  • дашборды загружаются быстрее;
  • нагрузка на сервер снижается.

В интерфейсе оператора на панели виджета дашборда доступна кнопка Обновить данные. Она позволяет принудительно очистить кеш и загрузить актуальные значения.

Очистка кеша дашбордов

Очистка кеша дашбордов необходима для:

  • Обновления данных, чтобы дашборды отображали актуальные значения из базы.
  • Обновления конфигурации, чтобы изменения в настройках или структуре дашборда вступали в силу сразу, без ожидания окончания времени жизни кеша (cacheLifeTime).
  • Устранения ошибок, если дашборд отображает данные из кеша или отображает некорректные данные.
  • Поддержания стабильной работы интерфейса, исключения конфликтов и удаления устаревших данных.

Чтобы очистить кеш дашбордов:

  1. В интерфейсе администратора перейдите в раздел "Настройка системы" → "Консоль".
  2. Выполните следующий скрипт:

    Copy
    api.db.query("""
    DELETE
    FROM DBDashboards__Evt
    """).executeUpdate()
     
    api.db.query("""
    DELETE
    FROM DBDashboards\$cache
    """).executeUpdate()