Удобная обертка над 1c Redis Native AddIn (https://github.com/Daabramov/rediska)
- Наличие общего кеша между всеми сеансами
- Надежное кеширование на произвольный интервал времени
- Относительная персистентность кеша по сравнению с платформенным
- По приколу
Библиотека предоставляет возможность работы на 2 уровнях "абстракции"
Прямая работа с компонентой (см. ОМ КоннекторRedis). В этом режиме работа с Redis возможно только через строки, и вся логика конвертации сообщений ложится полностью на вас.
Пример:
КоннекторRedis.SET("foo", "bar", 10); // Устанавливает значение в кеш на 10 секунд
Значение = КоннекторRedis.GET("foo"); // Будет равно "bar" или Неопределено если время жизни истекло
Специальная подсистема кеширования, которая позволяет использовать кеш не углубляясь в само взаимодействие с redis.
Примеры:
// Получение значения из кеша, если значение в кеше отсутствует, то оно будет вычислено и положено в кеш
КлючREDIS = СтрШаблон("nearest-working-day:%1:ReceivePrevious=%2", XMLСтрока(НачалоДня(Дата)), Формат(ПереноситьНазад, "БЛ=false; БИ=true"));
Параметры = КешRedis.НовыеПараметры("КалендарныеГрафикиСлужебный.БлижайшийРабочийДень", КлючREDIS);
Параметры.Параметры.Добавить(Дата);
Параметры.Параметры.Добавить(ПереноситьНазад);
Возврат КешRedis.Значение(Параметры);
// Поддерживаются любые сериализуемые значения
ПараметрыКеша = КешRedis.НовыеПараметры("ИерархияПодчиненностиСлужебный.ПолучитьСотрудниковОтделаНаДату"); // метод возвращает таблицу значений
ПараметрыКеша.Ключ = ИерархияПодчиненностиСлужебный.КлючRedisСотрудникиОтдела(Отдел, Дата); // ключ вынесен в отдельный метод
ПараметрыКеша.ВремяЖизни = 10; // можно установить время жизни в секундах
ПараметрыКеша.Параметры.Добавить(Отдел);
ПараметрыКеша.Параметры.Добавить(Дата);
Результат = КешRedis.Значение(ПараметрыКеша);
Возврат Результат;
// Можно делать "вложенное" кеширование
// Например сделаем хранение рабочих дней по родителю "день отсчета", а поле отсрочка в днях
КлючREDIS = СтрШаблон("add-working-days:%1", XMLСтрока(НачалоДня(Дата));
Параметры = КешRedis.НовыеПараметры("КалендарныеГрафикиСлужебный.ПрибавитьРабочиеДни", КлючREDIS);
Параметры.Поле = XMLСтрока(КоличествоДней);
Параметры.Параметры.Добавить(Дата);
Параметры.Параметры.Добавить(КоличествоДней);
Возврат КешRedis.Значение(Параметры); // будет использовать HSET вместо SET, что позволит по ключу удалить или получить сразу все значения
// Если все параметры метода являются серализуемыми значениями, то указание ключа можно опустить
// Значени ключа в таком случае будет вычислено автоматически
// Если параметров метода нет, их тоже можно не указывать
Результат = КешRedis.Значение(КешRedis.НовыеПараметры("МойМодуль.МетодБезПараметров");
- Рекомедуется использовать на платформе 8.3.21+. На этой версии и выше будет использовать серилизация Fast Infoset, которая работает чуть быстрее чем Json, а также занимает значительно меньше места, а значит будет снижать задержку на сетевой инфраструктуре и памяти.
- По возможности кешируйте сложновычисляемые константные или редкоизменяемые значения. Обертка и компонента накладывает свои расходы, поэтому обязательно делайте замеры и сверяйте с результатми без использования кеширования.
- Старайтесь устанавливать время жизни кеша или периодически делать его очистку.
- Для управлением жизни кеша предусмотрена базовая подписка "ОбработкаКешаRedis", вы можете создать свои подписки и очищать связанный кеш при записи различных данных в основную БД.
Процедура ОчисткаКешаRedisПриЗаписи(Источник, Отказ, Замещение) Экспорт
МетаданныеРегистра = Источник.Метаданные();
Если МетаданныеРегистра = Метаданные.РегистрыСведений.НазначенныеЗадачи
Или МетаданныеРегистра = Метаданные.РегистрыСведений.Собеседники Тогда
Задача = Источник.Отбор.Задача.Значение;
Если Не Задача.Пустая() Тогда
СистемаКонтроляДоступаСлужебный.ОчиститьКешДоступа(Задача);
КонецЕсли;
КонецЕсли;
Если МетаданныеРегистра = Метаданные.РегистрыСведений.ТегированныЗадачи Тогда
Задача = Источник.Отбор.Задача.Значение;
Если Не Задача.Пустая() Тогда
РаботаСТегамиСлужебный.ОчиститьКешТегов(Задача);
КонецЕсли;
КонецЕсли;
// внутри методов код примерно следующий
КоннекторRedis.DEL(КлючКешаТеговЗадачи(Задача));
КонецПроцедуры
SET, GET, HSET, HGET, DEL, EXISTS, FLUSHALL, LPUSH
Не полностью: LRANGE (пока разделителем идет пустая строка)
- Не поддерживается кеширование Неопределено (в будущем будет реализовано)
- Поддерживается не полый спектр команд redis
Библиотека поставляется в виде отдельной конфигурации, все объекты находятся в подсистеме "Redis". В состав библиотеки уже входит предсобранные Native Addin компоненты для Win64 и Linux64. Сама компонента поддерживает работу как на сервере, так и на клиенте в синхронном режиме, однако, данная библиотека поддерживает работу только в серверном режиме, так как поддержка клиента нарушает концепцию библиотеки. Разработка ведется в формате EDT на платформе 8.3.21, однако поддерживаются версии начиная с 8.3.12
- Выполните сравнение-объединение со своей конфигурации
- Снимите все галки
- Выберите "отобрать по подсистемам из файла" и выберите подсистему Redis
- Нажмите все галки
- Объедините состав подписки "ОбработкаКешаRedis" и также общий модуль "ПодпискиRedis", в случае, если вы уже включали свои объекты в состав подписки
В режиме предприятия установите значения констант "RedisURI" и "ИспользоватьRedis" Адрес редис должнен быть введен в следующем формате:
tcp :// [[username :] password@] host [:port][/database]
Пример: "tcp://default:redispw@localhost:49153"