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

Введение в Spring Data Redis Reactive

Изучите основы использования Spring Data Redis Reactive

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

1. введение

В этом уроке мы узнаем, как настроить и реализовать операции Redis с помощью ReactiveRedisTemplate Spring Data.

Мы рассмотрим основные способы использования ReactiveRedisTemplate , например, как хранить и извлекать объекты в Redis. И мы рассмотрим, как выполнять команды Redis с помощью Reactive RedisConnection .

Чтобы охватить основы, ознакомьтесь с нашим введением в Spring Data Redis .

2. Настройка

Чтобы использовать Reactive RedisTemplate в нашем коде, сначала нам нужно добавить зависимость для модуля Spring Boot Red is Reactive :


    org.springframework.boot
    spring-boot-starter-data-redis-reactive

3. Конфигурация

Затем , нам нужно установить соединение с нашим сервером Redis. Нам не нужно добавлять какой-либо код для настройки, если вы хотите подключиться к серверу Redis по адресу localhost:6379 .

Но, если бы наш сервер был удаленным или находился на другом порту, мы могли бы указать имя хоста и порт в конструкторе LettuceConnectionFactory :

@Bean
public ReactiveRedisConnectionFactory reactiveRedisConnectionFactory() {
    return new LettuceConnectionFactory(host, port);
}

4. Операции со списком

Списки Redis – это списки строк, отсортированных по порядку вставки. Мы можем добавлять или удалять элементы из списка, нажимая или выталкивая их слева или справа.

4.1. Шаблон строки

Для работы со списками нам понадобится экземпляр Reactive StringRedisTemplate для получения ссылки на RedisListOperations :

@Autowired
private ReactiveStringRedisTemplate redisTemplate;
private ReactiveListOperations reactiveListOps;
@Before
public void setup() {
    reactiveListOps = redisTemplate.opsForList();
}

4.2. ТОЛЧОК и ХЛОПОК

Теперь, когда у нас есть экземпляр операций ReactiveList, давайте выполним операцию PUSH для списка с demo_list в качестве идентификатора списка.

После этого мы сделаем LPOP в списке, а затем проверим, что элемент выскочил:

@Test
public void givenListAndValues_whenLeftPushAndLeftPop_thenLeftPushAndLeftPop() {
    Mono lPush = reactiveListOps.leftPushAll(LIST_NAME, "first", "second")
      .log("Pushed");
    StepVerifier.create(lPush)
      .expectNext(2L)
      .verifyComplete();
    Mono lPop = reactiveListOps.leftPop(LIST_NAME)
      .log("Popped");
    StepVerifier.create(lPop)
      .expectNext("second")
      .verifyComplete();
}

Обратите внимание, что при тестировании реактивных компонентов мы можем использовать Step Verifier для блокировки для завершения задачи.

5. Операции со значениями

Возможно, мы также захотим использовать пользовательские объекты, а не только строки.

Итак, давайте выполним некоторые аналогичные операции с объектом Employee , чтобы продемонстрировать наши операции с POJO:

public class Employee implements Serializable {
    private String id;
    private String name;
    private String department;
    // ... getters and setters
    // ... hashCode and equals
}

5.1. Шаблон сотрудника

Нам нужно будет создать второй экземпляр Reactive RedisTemplate. Мы по-прежнему будем использовать String для нашего ключа, но на этот раз значение будет Employee :

@Bean
public ReactiveRedisTemplate reactiveRedisTemplate(
  ReactiveRedisConnectionFactory factory) {
    StringRedisSerializer keySerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer valueSerializer =
      new Jackson2JsonRedisSerializer<>(Employee.class);
    RedisSerializationContext.RedisSerializationContextBuilder builder =
      RedisSerializationContext.newSerializationContext(keySerializer);
    RedisSerializationContext context = 
      builder.value(valueSerializer).build();
    return new ReactiveRedisTemplate<>(factory, context);
}

Чтобы правильно сериализовать пользовательский объект, нам нужно проинструктировать Spring о том, как это сделать. Здесь мы сказали шаблону использовать библиотеку Джексона, настроив Jackson2JsonRedisSerializer для значения . Поскольку ключ-это просто строка, мы можем использовать для этого StringRedisSerializer .

Затем мы берем этот контекст сериализации и нашу фабрику соединений, чтобы создать шаблон, как и раньше.

Затем мы создадим экземпляр Операций с реактивным значением точно так же, как мы делали ранее с операциями ReactiveList :

@Autowired
private ReactiveRedisTemplate redisTemplate;
private ReactiveValueOperations reactiveValueOps;
@Before
public void setup() {
    reactiveValueOps = redisTemplate.opsForValue();
}

5.2. Операции сохранения и извлечения

Теперь, когда у нас есть экземпляр Операций с реактивным значением, давайте использовать его для хранения экземпляра Employee :

@Test
public void givenEmployee_whenSet_thenSet() {
    Mono result = reactiveValueOps.set("123", 
      new Employee("123", "Bill", "Accounts"));
    StepVerifier.create(result)
      .expectNext(true)
      .verifyComplete();
}

И тогда мы сможем получить тот же объект обратно от Redis:

@Test
public void givenEmployeeId_whenGet_thenReturnsEmployee() {
    Mono fetchedEmployee = reactiveValueOps.get("123");
    StepVerifier.create(fetchedEmployee)
      .expectNext(new Employee("123", "Bill", "Accounts"))
      .verifyComplete();
}

5.3. Операции С Истекшим Сроком Действия

Мы часто хотим поместить значения в кэш , срок действия которого, естественно, истечет , и мы можем сделать это с помощью той же операции set :

@Test
public void givenEmployee_whenSetWithExpiry_thenSetsWithExpiryTime() 
  throws InterruptedException {
    Mono result = reactiveValueOps.set("129", 
      new Employee("129", "John", "Programming"), 
      Duration.ofSeconds(1));
    StepVerifier.create(result)
      .expectNext(true)
      .verifyComplete();
    Thread.sleep(2000L); 
    Mono fetchedEmployee = reactiveValueOps.get("129");
    StepVerifier.create(fetchedEmployee)
      .expectNextCount(0L)
      .verifyComplete();
}

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

6. Команды Redis

Команды Redis – это в основном методы, которые клиент Redis может вызывать на сервере. И Redis поддерживает десятки команд, некоторые из которых мы уже видели, такие как PUSH и POP.

То Операции API-это абстракция более высокого уровня вокруг набора команд Redis.

Однако если мы хотим использовать примитивы команд Redis более непосредственно, то Spring Data Redis Reactive также предоставляет нам Команды API.

Итак, давайте рассмотрим строковые и ключевые команды через призму Commands API.

6.1. Строковые и ключевые команды

Для выполнения командных операций Redis мы получим экземпляры команд Reactive Key и Reactive String.

Мы можем получить их оба из нашего экземпляра Reactive RedisConnectionFactory :

@Bean
public ReactiveKeyCommands keyCommands(ReactiveRedisConnectionFactory 
  reactiveRedisConnectionFactory) {
    return reactiveRedisConnectionFactory.getReactiveConnection().keyCommands();
}
@Bean
public ReactiveStringCommands stringCommands(ReactiveRedisConnectionFactory 
  reactiveRedisConnectionFactory) {
    return reactiveRedisConnectionFactory.getReactiveConnection().stringCommands();
}

6.2. Установка и получение операций

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

И затем мы можем получить эти ключи с помощью Реактивных ключевых команд , вызова команды КЛЮЧЕЙ :

@Test
public void givenFluxOfKeys_whenPerformOperations_thenPerformOperations() {
    Flux keys = Flux.just("key1", "key2", "key3", "key4");
      .map(String::getBytes)
      .map(ByteBuffer::wrap)
      .map(key -> SetCommand.set(key).value(key));
    StepVerifier.create(stringCommands.set(keys))
      .expectNextCount(4L)
      .verifyComplete();
    Mono keyCount = keyCommands.keys(ByteBuffer.wrap("key*".getBytes()))
      .flatMapMany(Flux::fromIterable)
      .count();
    StepVerifier.create(keyCount)
      .expectNext(4L)
      .verifyComplete();
}

Обратите внимание, что, как уже говорилось ранее, этот API гораздо более низкоуровневый. Например, вместо того, чтобы иметь дело с объектами высокого уровня, мы отправляем поток байтов, используя ByteBuffer . Кроме того, мы используем больше примитивов Red is, таких как SET и SCAN.

Наконец, строковые и ключевые команды-это всего лишь два из многих командных интерфейсов, которые Spring Data Redis предоставляет реактивно.

7. Заключение

В этом уроке мы рассмотрели основы использования реактивной RedisTemplate Spring Data и различные способы ее интеграции с нашим приложением.

Полный исходный код примеров доступен на GitHub .