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 ReactiveListOperationsreactiveListOps; @Before public void setup() { reactiveListOps = redisTemplate.opsForList(); }
4.2. ТОЛЧОК и ХЛОПОК
Теперь, когда у нас есть экземпляр операций ReactiveList, давайте выполним операцию PUSH для списка с demo_list в качестве идентификатора списка.
После этого мы сделаем LPOP в списке, а затем проверим, что элемент выскочил:
@Test public void givenListAndValues_whenLeftPushAndLeftPop_thenLeftPushAndLeftPop() { MonolPush = 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 ReactiveRedisTemplatereactiveRedisTemplate( 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 ReactiveRedisTemplateredisTemplate; private ReactiveValueOperations reactiveValueOps; @Before public void setup() { reactiveValueOps = redisTemplate.opsForValue(); }
5.2. Операции сохранения и извлечения
Теперь, когда у нас есть экземпляр Операций с реактивным значением, давайте использовать его для хранения экземпляра Employee :
@Test public void givenEmployee_whenSet_thenSet() { Monoresult = reactiveValueOps.set("123", new Employee("123", "Bill", "Accounts")); StepVerifier.create(result) .expectNext(true) .verifyComplete(); }
И тогда мы сможем получить тот же объект обратно от Redis:
@Test public void givenEmployeeId_whenGet_thenReturnsEmployee() { MonofetchedEmployee = reactiveValueOps.get("123"); StepVerifier.create(fetchedEmployee) .expectNext(new Employee("123", "Bill", "Accounts")) .verifyComplete(); }
5.3. Операции С Истекшим Сроком Действия
Мы часто хотим поместить значения в кэш , срок действия которого, естественно, истечет , и мы можем сделать это с помощью той же операции set :
@Test public void givenEmployee_whenSetWithExpiry_thenSetsWithExpiryTime() throws InterruptedException { Monoresult = 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() { Fluxkeys = 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 .