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

С версии 3.10

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

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

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

Кэширование позволяет существенно снизить нагрузку на сервер, сократить время отклика при отображении дашбордов и обеспечить стабильную работу интерфейса при повторных обращениях к одним и тем же данным.

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

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

    Чем ниже пороговое значение, тем больше виджетов потенциально попадает в кеш, что способствует ускорению загрузки дашбордов. Ресурсоемкие виджеты, время построения которых превышает лимит, исключаются из кеширования, чтобы не перегружать систему.

Логика работы кеша (cacheEnabled = true)

  • Первое обращение к дашборду.

    При первом обращении к виджету/дашборду выполняется запрос к БД и результат записывается в кеш как новая запись. Создается объект типа "Кэш" (cache).

  • Повторные обращения (чтение из кэша).

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

    Для найденного объекта типа "Кэш" (cache) обновляется dateRead, то есть фиксируется время последнего чтения.

  • Принудительное обновление при нажатии кнопки "Обновить данные".

    Нажатие кнопки инициирует новый запрос к БД (игнорируется кэш) и результат записывается в кеш как новая запись с новыми данными. Создается новый объект типа "Кэш" (cache).

  • Обновление браузера (F5 / перезагрузка страницы)

    Перезагрузка страницы читает данные из кэша и обновляет dateRead. Нового запроса к БД не выполняется.

  • Истечение времени жизни кеша

    Если прошел интервал cacheLifeTime с момента создания/последнего обновления записи, то запись считается устаревшей и при следующем обращении будет выполнен новый запрос к БД и создан новый объект типа "Кэш" (cache).

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

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

    • "Код виджета" (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. У пользователя дашбордов должны быть открыты права:

    • на редактирование атрибутов класса "Дашборды" (DBDashboards);
    • на просмотр атрибутов в типе "Настройки дашбордов" (settings);
    • на добавление объектов в тип "Кэш" (cache).
  4. Перейдите в раздел "Настройка системы" → "Консоль" и создайте один единственный объект типа "Настройки дашбордов":

    utils.create('DBDashboards$settings', [title: 'Настройки дашбордов']).UUID

  5. Перейдите в раздел "Настройка системы" → "Администрирование" → вкладка "Управление логом событий" и создайте правило: не хранить логи по кешам дашбордов (для объектов данного типа логи не создаются).

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

Необязательные настройки

  1. Перейдите в раздел "Классы" → класс "Дашборды" (DBDashboards) → тип "Настойки дашбордов" (settings) → вкладка "Карточка объекта".

    Выведите атрибуты настройки сохранения кеша в контент "Параметры объекта":

    • Название;
    • Тип объекта;
    • Кэш включен;
    • Количество объектов в кэше;
    • Время жизни кэша;
    • Время построения виджета для попадания в кэш (сек.);
    • Код виджета;
    • Фильтры;
    • Язык.

    Подробное описание контента приводится в разделе Контент "Параметры объекта".

  2. Перейдите в раздел "Классы" → класс "Дашборды" (DBDashboards) → тип "Кэш" (cache) → вкладка "Карточка объекта".

    Выведите атрибуты в контент "Параметры объекта":

    • Название;
    • Тип объекта;
    • Код виджета;
    • Язык;
    • Смещение между серверным и пользовательским ЧП;
    • Фильтры;
    • Значение;
    • UUID субъекта;
    • Кэш включен;
    • Количество объектов в кэше.

    Подробное описание контента приводится в разделе Контент "Параметры объекта".

  3. Перейдите в раздел "Классы" → класс "Дашборды" (DBDashboards) → тип "Настойки дашбордов" (settings) → вкладка "Карточка объекта".

    Выведите список объектов типа "Кэш" (cache) в контент "Список объектов". Подробное описание контента приводится в разделе Контент "Список объектов".

    Объекты типа "Кэш" (cache) создаются автоматически с ID виджета, по нему можно определить соответствующий объект. На карточке объекта "Кэш" видны значения, которые записаны в кэш.

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

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

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

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

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

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

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

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

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

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

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