Рубрики
Без рубрики

Пружинный загрузчик с Redis: Операции с трубопроводами

В этом руководстве мы выполним конвейеризацию операций Redis для Java-приложений Spring Boot, чтобы повысить эффективность и производительность.

Автор оригинала: Guest Contributor.

Вступление

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

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

Вариант использования конвейерной обработки красным цветом-это

Redis основан на архитектуре Клиент/Сервер(Запрос/Ответ). В этих архитектурах клиент обычно отправляет запрос или запрос на сервер и ожидает ответа. Обычно это делается блокирующим способом, так что новый запрос не может быть отправлен до тех пор, пока не будет отправлен ответ на последний:

Client: 
Server: Response for 
Client: 
Server: Response for 
Client: 
Server: Response for 

Это может привести к огромной неэффективности с высокой задержкой между получением команд и их обработкой.

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

Client: 
Client: 
Client: 
Server: Response for 
Server: Response for 
Server: Response for 

Поскольку клиент не ожидает ответа сервера перед выполнением другой команды, задержка уменьшается, что, в свою очередь, повышает производительность приложения.

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

Реализация

Давайте продолжим и создадим небольшое приложение Spring Boot, которое работает с Redis и передает несколько команд. Это упрощается с помощью проекта Spring Data Redis .

Установка Пружинной Загрузки

Самый простой способ начать с чистого приложения Spring Boot-это использовать Spring Initializr :

Кроме того, вы также можете использовать интерфейс командной строки Spring Boot для начальной загрузки приложения:

$ spring init --dependencies=spring-boot-starter-data-redis redis-spring-boot-demo

Мы начинаем с зависимости spring-boot-starter-data-redis , поскольку она включает spring-data-redis , spring-boot-starter и |/ядро салата .

Если у вас уже есть приложение Maven/Spring, добавьте зависимость в свой pom.xml файл:


	org.springframework.boot
	spring-boot-starter-data-redis
	${version}

Или если вы используете Gradle:

compile group: 'org.springframework.data', name: 'spring-data-redis', version: '${version}'

Мы также будем использовать Jedis в качестве клиента подключения, а не Салат:


	redis.clients
	jedis
	${version}

Конфигурация Redis

Мы разместим Redis в Scale grid , которая предоставляет бесплатную пробную учетную запись, для размещения экземпляра сервера Redis. В качестве альтернативы вы можете загрузить сервер и разместить его на своем собственном компьютере в Linux и macOS. Windows требует небольшого взлома и сложна в настройке.

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

@Configuration
public class Config {
    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName("");
        jedisConnectionFactory.setPort(6379);
        jedisConnectionFactory.setPassword("");
        jedisConnectionFactory.afterPropertiesSet();
        return jedisConnectionFactory;
    }
}

RedisTemplate -это класс ввода, предоставляемый Spring Data, с помощью которого мы взаимодействуем с сервером Redis.

Мы передадим ему нашу настроенную фабрику соединений:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

@Bean
public RedisTemplate redisTemplate() {
    RedisTemplate redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    redisTemplate.setDefaultSerializer(RedisSerializer.string());
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

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

Конвейерная обработка С использованием RedisTemplate

Давайте добавим несколько элементов из списка на сервер Redis. Мы сделаем это без конвейерной обработки, используя RedisTemplate . В частности, мы будем использовать интерфейс ListOperations , полученный из opsForList() :

List values = Arrays.asList("value-1", "value-2", "value-3", "value-4", "value-5");
redisTemplate.opsForList().leftPushAll("pipeline-list", values);

Выполнение этого кода приведет к:

А теперь давайте уберем это. Предполагая, что это может быть дорогостоящей операцией, мы передадим каждую команду rPop() по конвейеру, чтобы они отправлялись вместе и чтобы результаты синхронизировались при удалении всех элементов. Затем мы получим эти результаты обратно. Для конвейерных команд мы используем метод executed Pipeline () .

Он принимает Обратный вызов или Обратный вызов сеанса , который мы ему предоставляем. Метод выполненный конвейер() возвращает результаты, которые мы затем можем записать и просмотреть. Если это не нужно, и вы просто хотите выполнить команды, вы можете использовать метод execute() и передать true в качестве аргумента конвейера вместо этого:

List results = redisTemplate.executePipelined(new RedisCallback() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
        for(int i = 0; i < 5; i++) {
            connection.rPop("pipeline-list".getBytes());
        }
    return null;
     }
});
return results;

Метод execute Pipelined() принял новый обратный вызов() , в котором мы используем метод doInRedis () , чтобы указать, что мы хотели бы сделать.

В частности, мы запустили метод rPop() 5 раз, удалив 5 элементов списка, которые мы вставили заранее.

Как только все пять из этих команд будут выполнены, элементы будут удалены из списка и отправлены обратно – результаты будут упакованы в результаты список:

Вывод

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

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

В этой статье мы передали несколько команд по конвейеру с помощью API RedisTemplate и проверили результаты.