diff --git a/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java b/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java
index 50d35b9b1c..6c7a03cb70 100644
--- a/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java
+++ b/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java
@@ -55,7 +55,7 @@ public class InfluxDBConnectionLiveTest {
InfluxDB connection = connectDatabase();
- // Create "baeldung and check for it
+ // Create "baeldung" and check for it
connection.createDatabase("baeldung");
assertTrue(connection.databaseExists("baeldung"));
diff --git a/persistence-modules/redis/README.md b/persistence-modules/redis/README.md
index d179b80c33..dd655ca7aa 100644
--- a/persistence-modules/redis/README.md
+++ b/persistence-modules/redis/README.md
@@ -1,3 +1,5 @@
### Relevant Articles:
- [Intro to Jedis – the Java Redis Client Library](http://www.baeldung.com/jedis-java-redis-client-library)
- [A Guide to Redis with Redisson](http://www.baeldung.com/redis-redisson)
+- [Intro to Lettuce – the Java Redis Client Library](http://www.baeldung.com/lettuce-java-redis-client-library)
+
diff --git a/persistence-modules/redis/pom.xml b/persistence-modules/redis/pom.xml
index 4321b491eb..1f27faa09a 100644
--- a/persistence-modules/redis/pom.xml
+++ b/persistence-modules/redis/pom.xml
@@ -36,6 +36,13 @@
redisson
3.3.0
+
+
+ io.lettuce
+ lettuce-core
+ 5.0.1.RELEASE
+
+
diff --git a/persistence-modules/redis/src/test/java/com/baeldung/LettuceIntegrationLiveTest.java b/persistence-modules/redis/src/test/java/com/baeldung/LettuceIntegrationLiveTest.java
new file mode 100644
index 0000000000..eb879d1d21
--- /dev/null
+++ b/persistence-modules/redis/src/test/java/com/baeldung/LettuceIntegrationLiveTest.java
@@ -0,0 +1,312 @@
+package com.baeldung;
+
+import io.lettuce.core.LettuceFutures;
+import io.lettuce.core.RedisClient;
+import io.lettuce.core.RedisFuture;
+import io.lettuce.core.TransactionResult;
+import io.lettuce.core.api.StatefulRedisConnection;
+import io.lettuce.core.api.async.RedisAsyncCommands;
+import io.lettuce.core.api.sync.RedisCommands;
+import io.lettuce.core.pubsub.RedisPubSubListener;
+import io.lettuce.core.pubsub.StatefulRedisPubSubConnection;
+import io.lettuce.core.pubsub.api.async.RedisPubSubAsyncCommands;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.assertTrue;
+
+public class LettuceIntegrationLiveTest {
+
+ private static Logger log = LoggerFactory.getLogger(LettuceIntegrationLiveTest.class);
+
+ private static StatefulRedisConnection redisConnection;
+
+ private static RedisClient redisClient;
+
+ @BeforeClass
+ public static void setUp() {
+ // Docker defaults to mapping redis port to 32768
+ redisClient = RedisClient.create("redis://localhost:32768/");
+ redisConnection = redisClient.connect();
+ }
+
+ @AfterClass
+ public static void destroy() {
+ redisConnection.close();
+ }
+
+ @Test
+ public void givenAString_thenSaveItAsRedisStringsSync() {
+
+ RedisCommands syncCommands = redisConnection.sync();
+
+ String key = "key";
+ String value = "value";
+
+ syncCommands.set(key, value);
+ String response = syncCommands.get(key);
+
+ Assert.assertEquals(value, response);
+ }
+
+ @Test
+ public void givenValues_thenSaveAsRedisHashSync() {
+
+ RedisCommands syncCommands = redisConnection.sync();
+
+ String recordName = "record1";
+ String name = "FirstName";
+ String value = "John";
+ String surname = "LastName";
+ String value1 = "Smith";
+
+ syncCommands.hset(recordName, name, value);
+ syncCommands.hset(recordName, surname, value1);
+ Map record = syncCommands.hgetall(recordName);
+
+ Assert.assertEquals(record.get(name), value);
+ Assert.assertEquals(record.get(surname), value1);
+ }
+
+ @Test
+ public void givenAString_thenSaveItAsRedisStringsAsync() throws Exception {
+
+ RedisAsyncCommands asyncCommands = redisConnection.async();
+
+ String key = "key";
+ String value = "value";
+
+ asyncCommands.set(key, value);
+ RedisFuture redisFuture = asyncCommands.get(key);
+
+ String response = redisFuture.get();
+
+ Assert.assertEquals(value, response);
+ }
+
+ @Test
+ public void givenValues_thenSaveAsRedisHashAsync() throws Exception {
+
+ RedisAsyncCommands asyncCommands = redisConnection.async();
+
+ String recordName = "record1";
+ String name = "FirstName";
+ String value = "John";
+ String surname = "LastName";
+ String value1 = "Smith";
+
+ asyncCommands.hset(recordName, name, value);
+ asyncCommands.hset(recordName, surname, value1);
+ RedisFuture