Skip to content

Daabramov/1c-redis-lib

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 

Repository files navigation

1c-redis-lib

Удобная обертка над 1c Redis Native AddIn (https://github.com/Daabramov/rediska)

Целеполагание

  1. Наличие общего кеша между всеми сеансами
  2. Надежное кеширование на произвольный интервал времени
  3. Относительная персистентность кеша по сравнению с платформенным
  4. По приколу

Возможности

Библиотека предоставляет возможность работы на 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.НовыеПараметры("МойМодуль.МетодБезПараметров");

Рекомендации

  1. Рекомедуется использовать на платформе 8.3.21+. На этой версии и выше будет использовать серилизация Fast Infoset, которая работает чуть быстрее чем Json, а также занимает значительно меньше места, а значит будет снижать задержку на сетевой инфраструктуре и памяти.
  2. По возможности кешируйте сложновычисляемые константные или редкоизменяемые значения. Обертка и компонента накладывает свои расходы, поэтому обязательно делайте замеры и сверяйте с результатми без использования кеширования.
  3. Старайтесь устанавливать время жизни кеша или периодически делать его очистку.
  4. Для управлением жизни кеша предусмотрена базовая подписка "ОбработкаКешаRedis", вы можете создать свои подписки и очищать связанный кеш при записи различных данных в основную БД.
Процедура ОчисткаКешаRedisПриЗаписи(Источник, Отказ, Замещение) Экспорт
	
	МетаданныеРегистра = Источник.Метаданные();
	Если МетаданныеРегистра = Метаданные.РегистрыСведений.НазначенныеЗадачи 
			Или МетаданныеРегистра =  Метаданные.РегистрыСведений.Собеседники Тогда
		Задача = Источник.Отбор.Задача.Значение;
		Если Не Задача.Пустая() Тогда
			СистемаКонтроляДоступаСлужебный.ОчиститьКешДоступа(Задача);
		КонецЕсли;
	КонецЕсли;
	
	Если МетаданныеРегистра =  Метаданные.РегистрыСведений.ТегированныЗадачи Тогда
		Задача = Источник.Отбор.Задача.Значение;
		Если Не Задача.Пустая() Тогда
			РаботаСТегамиСлужебный.ОчиститьКешТегов(Задача);
		КонецЕсли;
	КонецЕсли;
  
  // внутри методов код примерно следующий
  КоннекторRedis.DEL(КлючКешаТеговЗадачи(Задача));
				
КонецПроцедуры

Реализованные методы Redis

SET, GET, HSET, HGET, DEL, EXISTS, FLUSHALL, LPUSH

Не полностью: LRANGE (пока разделителем идет пустая строка)

Ограничения

  1. Не поддерживается кеширование Неопределено (в будущем будет реализовано)
  2. Поддерживается не полый спектр команд redis

Поставка

Библиотека поставляется в виде отдельной конфигурации, все объекты находятся в подсистеме "Redis". В состав библиотеки уже входит предсобранные Native Addin компоненты для Win64 и Linux64. Сама компонента поддерживает работу как на сервере, так и на клиенте в синхронном режиме, однако, данная библиотека поддерживает работу только в серверном режиме, так как поддержка клиента нарушает концепцию библиотеки. Разработка ведется в формате EDT на платформе 8.3.21, однако поддерживаются версии начиная с 8.3.12

Установка

  1. Выполните сравнение-объединение со своей конфигурации
  2. Снимите все галки
  3. Выберите "отобрать по подсистемам из файла" и выберите подсистему Redis
  4. Нажмите все галки
  5. Объедините состав подписки "ОбработкаКешаRedis" и также общий модуль "ПодпискиRedis", в случае, если вы уже включали свои объекты в состав подписки

В режиме предприятия установите значения констант "RedisURI" и "ИспользоватьRedis" Адрес редис должнен быть введен в следующем формате:

tcp :// [[username :] password@] host [:port][/database]

Пример: "tcp://default:redispw@localhost:49153"

About

Удобная обертка над 1c Redis Native AddIn

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published