diff --git a/logging-modules/log4j2/${sys:logging.folder.path} b/logging-modules/log4j2/${sys:logging.folder.path}
new file mode 100755
index 0000000000..e69de29bb2
diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml
index 5981bf41e0..bee3d683b8 100644
--- a/persistence-modules/spring-data-redis/pom.xml
+++ b/persistence-modules/spring-data-redis/pom.xml
@@ -7,17 +7,61 @@
jar
+ parent-boot-2
com.baeldung
- parent-spring-5
0.0.1-SNAPSHOT
- ../../parent-spring-5
+ ../../parent-boot-2
- org.springframework.data
- spring-data-redis
- ${spring-data-redis}
+ org.springframework.boot
+ spring-boot-starter-data-redis-reactive
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.projectlombok
+ lombok
+
+
+ io.projectreactor
+ reactor-test
+ test
+
+
+
+ org.springframework
+ spring-test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.junit.platform
+ junit-platform-surefire-provider
+ ${junit.platform.version}
+ test
+
+
+ org.junit.platform
+ junit-platform-runner
+ ${junit.platform.version}
+ test
@@ -33,42 +77,12 @@
jar
-
- org.springframework
- spring-core
- ${spring.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
-
- org.springframework
- spring-context
- ${spring.version}
-
-
-
- org.springframework
- spring-test
- ${spring.version}
- test
-
-
com.lordofthejars
nosqlunit-redis
${nosqlunit.version}
-
- org.springframework.data
- spring-data-commons
- ${spring-data-commons.version}
-
com.github.kstyrc
embedded-redis
@@ -77,12 +91,13 @@
- 2.0.3.RELEASE
3.2.4
2.9.0
0.10.0
2.0.3.RELEASE
0.6
+ 1.0.0
+ 5.0.2
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/SpringRedisReactiveApplication.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/SpringRedisReactiveApplication.java
new file mode 100644
index 0000000000..8b1f892f67
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/SpringRedisReactiveApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.spring.data.reactive.redis;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringRedisReactiveApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringRedisReactiveApplication.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java
new file mode 100644
index 0000000000..d23d0092eb
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java
@@ -0,0 +1,56 @@
+package com.baeldung.spring.data.reactive.redis.config;
+
+
+import com.baeldung.spring.data.reactive.redis.model.Employee;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.ReactiveKeyCommands;
+import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
+import org.springframework.data.redis.connection.ReactiveStringCommands;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import javax.annotation.PreDestroy;
+
+@Configuration
+public class RedisConfig {
+
+ @Autowired
+ RedisConnectionFactory factory;
+
+ @Bean
+ public ReactiveRedisTemplate reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
+ Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Employee.class);
+ RedisSerializationContext.RedisSerializationContextBuilder builder = RedisSerializationContext.newSerializationContext(new StringRedisSerializer());
+ RedisSerializationContext context = builder.value(serializer)
+ .build();
+ return new ReactiveRedisTemplate<>(factory, context);
+ }
+
+ @Bean
+ public ReactiveRedisTemplate reactiveRedisTemplateString(ReactiveRedisConnectionFactory connectionFactory) {
+ return new ReactiveRedisTemplate<>(connectionFactory, RedisSerializationContext.string());
+ }
+
+ @Bean
+ public ReactiveKeyCommands keyCommands(final ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
+ return reactiveRedisConnectionFactory.getReactiveConnection()
+ .keyCommands();
+ }
+
+ @Bean
+ public ReactiveStringCommands stringCommands(final ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
+ return reactiveRedisConnectionFactory.getReactiveConnection()
+ .stringCommands();
+ }
+
+ @PreDestroy
+ public void cleanRedis() {
+ factory.getConnection()
+ .flushDb();
+ }
+}
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/model/Employee.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/model/Employee.java
new file mode 100644
index 0000000000..9178f6e112
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/model/Employee.java
@@ -0,0 +1,21 @@
+package com.baeldung.spring.data.reactive.redis.model;
+
+import java.io.Serializable;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode
+public class Employee implements Serializable {
+ private static final long serialVersionUID = 1603714798906422731L;
+ private String id;
+ private String name;
+ private String department;
+}
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
index 62a7886f46..6fdb3c5bef 100644
--- a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
@@ -1,6 +1,8 @@
package com.baeldung.spring.data.redis.config;
-import org.springframework.beans.factory.annotation.Value;
+import com.baeldung.spring.data.redis.queue.MessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -13,10 +15,6 @@ import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
-import com.baeldung.spring.data.redis.queue.MessagePublisher;
-import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
-import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
-
@Configuration
@ComponentScan("com.baeldung.spring.data.redis")
@EnableRedisRepositories(basePackages = "com.baeldung.spring.data.redis.repo")
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisKeyCommandsIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisKeyCommandsIntegrationTest.java
new file mode 100644
index 0000000000..e48aa1e06a
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisKeyCommandsIntegrationTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.spring.data.reactive.redis.template;
+
+
+import com.baeldung.spring.data.reactive.redis.SpringRedisReactiveApplication;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.connection.ReactiveKeyCommands;
+import org.springframework.data.redis.connection.ReactiveStringCommands;
+import org.springframework.data.redis.connection.ReactiveStringCommands.SetCommand;
+import org.springframework.test.context.junit4.SpringRunner;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+import java.nio.ByteBuffer;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisReactiveApplication.class)
+public class RedisKeyCommandsIntegrationTest {
+
+ @Autowired
+ private ReactiveKeyCommands keyCommands;
+
+ @Autowired
+ private ReactiveStringCommands stringCommands;
+
+ @Test
+ public void givenFluxOfKeys_whenPerformOperations_thenPerformOperations() {
+ Flux keys = Flux.just("key1", "key2", "key3", "key4");
+
+ Flux generator = keys.map(String::getBytes)
+ .map(ByteBuffer::wrap)
+ .map(key -> SetCommand.set(key)
+ .value(key));
+
+ StepVerifier.create(stringCommands.set(generator))
+ .expectNextCount(4L)
+ .verifyComplete();
+
+ Mono keyCount = keyCommands.keys(ByteBuffer.wrap("key*".getBytes()))
+ .flatMapMany(Flux::fromIterable)
+ .count();
+
+ StepVerifier.create(keyCount)
+ .expectNext(4L)
+ .verifyComplete();
+
+ }
+}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java
new file mode 100644
index 0000000000..3ebeff87b1
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.spring.data.reactive.redis.template;
+
+
+import com.baeldung.spring.data.reactive.redis.SpringRedisReactiveApplication;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.ReactiveListOperations;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.test.context.junit4.SpringRunner;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisReactiveApplication.class)
+public class RedisTemplateListOpsIntegrationTest {
+
+ private static final String LIST_NAME = "demo_list";
+
+ @Autowired
+ private ReactiveRedisTemplate redisTemplate;
+
+ private ReactiveListOperations reactiveListOps;
+
+ @Before
+ public void setup() {
+ reactiveListOps = redisTemplate.opsForList();
+ }
+
+ @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();
+ }
+
+}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateValueOpsIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateValueOpsIntegrationTest.java
new file mode 100644
index 0000000000..9490568089
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateValueOpsIntegrationTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.spring.data.reactive.redis.template;
+
+
+import com.baeldung.spring.data.reactive.redis.SpringRedisReactiveApplication;
+import com.baeldung.spring.data.reactive.redis.model.Employee;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.data.redis.core.ReactiveValueOperations;
+import org.springframework.test.context.junit4.SpringRunner;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+import java.time.Duration;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisReactiveApplication.class)
+public class RedisTemplateValueOpsIntegrationTest {
+
+ @Autowired
+ private ReactiveRedisTemplate redisTemplate;
+
+ private ReactiveValueOperations reactiveValueOps;
+
+ @Before
+ public void setup() {
+ reactiveValueOps = redisTemplate.opsForValue();
+ }
+
+ @Test
+ public void givenEmployee_whenSet_thenSet() {
+
+ Mono result = reactiveValueOps.set("123", new Employee("123", "Bill", "Accounts"));
+
+ StepVerifier.create(result)
+ .expectNext(true)
+ .verifyComplete();
+ }
+
+ @Test
+ public void givenEmployeeId_whenGet_thenReturnsEmployee() {
+
+ Mono fetchedEmployee = reactiveValueOps.get("123");
+
+ StepVerifier.create(fetchedEmployee)
+ .expectNext(new Employee("123", "Bill", "Accounts"))
+ .verifyComplete();
+ }
+
+ @Test
+ public void givenEmployee_whenSetWithExpiry_thenSetsWithExpiryTime() throws InterruptedException {
+
+ Mono result = reactiveValueOps.set("129", new Employee("129", "John", "Programming"), Duration.ofSeconds(1));
+
+ Mono fetchedEmployee = reactiveValueOps.get("129");
+
+ StepVerifier.create(result)
+ .expectNext(true)
+ .verifyComplete();
+
+ Thread.sleep(2000L);
+
+ StepVerifier.create(fetchedEmployee)
+ .expectNextCount(0L)
+ .verifyComplete();
+ }
+
+}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
index 5bc70069c5..99febb6430 100644
--- a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
@@ -31,7 +31,7 @@ public class RedisMessageListenerIntegrationTest {
@BeforeClass
public static void startRedisServer() throws IOException {
- redisServer = new redis.embedded.RedisServer(6379);
+ redisServer = new redis.embedded.RedisServer(6380);
redisServer.start();
}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
index 48832a8de9..43aadefc01 100644
--- a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
@@ -32,7 +32,7 @@ public class StudentRepositoryIntegrationTest {
@BeforeClass
public static void startRedisServer() throws IOException {
- redisServer = new redis.embedded.RedisServer(6379);
+ redisServer = new redis.embedded.RedisServer(6380);
redisServer.start();
}
diff --git a/pom.xml b/pom.xml
index 6c77ede1c2..28a6dd358e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -451,6 +451,7 @@
spring-5
spring-5-data-reactive
spring-5-reactive
+ spring-data-5-reactive/spring-5-data-reactive-redis
spring-5-reactive-security
spring-5-reactive-client
spring-5-mvc