Of course! Here is a comprehensive guide on using Java with Jedis to work with Redis Lists.

What is a Redis List?
A Redis List is a collection of string elements ordered by insertion order. It's very similar to a LinkedList in Java. You can add elements to the head (left) or tail (right) of the list, and retrieve elements by their index.
Key characteristics:
- Ordered: Elements maintain the order in which they were added.
- Duplicate Values: Can contain multiple instances of the same value.
- Efficient for Operations: Very fast for adding/removing elements from both ends.
Common use cases:
- Message Queues (Producer-Consumer pattern)
- Activity/Timeline Feeds (e.g., "recently viewed items")
- Stacks (LIFO) and Queues (FIFO)
Setup: Jedis Dependency
First, you need to add the Jedis library to your project. If you're using Maven, add this to your pom.xml:

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.0</version> <!-- Check for the latest version -->
</dependency>
For Gradle (build.gradle):
implementation 'redis.clients:jedis:5.1.0' // Check for the latest version
Basic Jedis Connection
Before performing any operations, you need to connect to your Redis server.
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisListExample {
public static void main(String[] args) {
// It's best practice to use a connection pool for production applications
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(10);
poolConfig.setMaxIdle(5);
// Replace "localhost" with your Redis host if it's not on the same machine
try (JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
Jedis jedis = jedisPool.getResource()) {
System.out.println("Connected to Redis successfully!");
// Now you can perform list operations
performListOperations(jedis);
} catch (Exception e) {
System.err.println("Error connecting to Redis: " + e.getMessage());
}
}
// We'll define our list operations in this method
private static void performListOperations(Jedis jedis) {
// ... operations will go here ...
}
}
Core List Operations with Jedis
Let's explore the most common Jedis methods for lists. All these methods operate on a list identified by a key.
Adding Elements
LPUSH key value [value ...]: Left PUSH. Adds one or more values to the head (left) of the list. Returns the new length of the list.RPUSH key value [value ...]: Right PUSH. Adds one or more values to the tail (right) of the list. Returns the new length of the list.
// In the performListOperations method
System.out.println("\n--- Adding Elements ---");
// Add "world" and "hello" to the head of the list "mylist"
jedis.lpush("mylist", "world", "hello"); // List is now: ["hello", "world"]
// Add "foo" and "bar" to the tail of the list "mylist"
jedis.rpush("mylist", "foo", "bar"); // List is now: ["hello", "world", "foo", "bar"]
System.out.println("List after LPUSH and RPUSH: " + jedis.lrange("mylist", 0, -1));
Getting Elements (Range)
LRANGE key start stop: Returns a range of elements from the list. This is the most common way to inspect a list.0is the first element.-1is the last element.0, -1gets the entire list.0, 2gets the first three elements.
// In the performListOperations method
System.out.println("\n--- Getting Elements (Range) ---");
// Get the entire list
List<String> fullList = jedis.lrange("mylist", 0, -1);
System.out.println("Full list: " + fullList); // [hello, world, foo, bar]
// Get the first two elements
List<String> firstTwo = jedis.lrange("mylist", 0, 1);
System.out.println("First two elements: " + firstTwo); // [hello, world]
Getting the Length
LLEN key: Returns the number of elements in the list.
// In the performListOperations method
System.out.println("\n--- Getting Length ---");
long length = jedis.llen("mylist");
System.out.println("Length of 'mylist': " + length); // 4
Removing Elements
- `LPOP keyLeft POP**. Removes and returns the first element of the list.
- `RPOP keyRight POP**. Removes and returns the last element of the list.
LREM key count value:- Removes elements equal to
valuefrom the list. count > 0: Removescountelements from the head.count < 0: Removescountelements from the tail.count = 0: Removes all elements equal tovalue.
- Removes elements equal to
// In the performListOperations method
System.out.println("\n--- Removing Elements ---");
// Remove and get the first element (head)
String leftPopped = jedis.lpop("mylist");
System.out.println("LPOP result: " + leftPopped); // hello
System.out.println("List after LPOP: " + jedis.lrange("mylist", 0, -1)); // [world, foo, bar]
// Remove and get the last element (tail)
String rightPopped = jedis.rpop("mylist");
System.out.println("RPOP result: " + rightPopped); // bar
System.out.println("List after RPOP: " + jedis.lrange("mylist", 0, -1)); // [world, foo]
// Remove all occurrences of "world"
long removedCount = jedis.lrem("mylist", 0, "world");
System.out.println("Removed " + removedCount + " elements of 'world'.");
System.out.println("List after LREM: " + jedis.lrange("mylist", 0, -1)); // [foo]
Other Useful Operations
LINDEX key index: Returns the element at the specifiedindex(0-based). Returnsnullif the index is out of range.LSET key index value: Sets the element at the specifiedindextovalue. Throws an error if the index is out of range.
// In the performListOperations method
System.out.println("\n--- Other Operations ---");
// Get the element at index 0
String element = jedis.lindex("mylist", 0);
System.out.println("Element at index 0: " + element); // foo
// Set the element at index 0 to "baz"
jedis.lset("mylist", 0, "baz");
System.out.println("List after LSET: " + jedis.lrange("mylist", 0, -1)); // [baz]
Complete Runnable Example
Here is the full code combining all the examples above.

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.List;
public class JedisListExample {
public static void main(String[] args) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(10);
poolConfig.setMaxIdle(5);
// Using try-with-resources to ensure the pool and connection are closed
try (JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
Jedis jedis = jedisPool.getResource()) {
System.out.println("Connected to Redis successfully!");
// Clear the list before starting for a clean run
jedis.del("mylist");
performListOperations(jedis);
} catch (Exception e) {
System.err.println("Error connecting to Redis: " + e.getMessage());
}
}
private static void performListOperations(Jedis jedis) {
System.out.println("--- Adding Elements ---");
jedis.lpush("mylist", "world", "hello");
jedis.rpush("mylist", "foo", "bar");
System.out.println("List after LPUSH and RPUSH: " + jedis.lrange("mylist", 0, -1));
System.out.println("\n--- Getting Elements (Range) ---");
System.out.println("Full list: " + jedis.lrange("mylist", 0, -1));
System.out.println("First two elements: " + jedis.lrange("mylist", 0, 1));
System.out.println("\n--- Getting Length ---");
System.out.println("Length of 'mylist': " + jedis.llen("mylist"));
System.out.println("\n--- Removing Elements ---");
String leftPopped = jedis.lpop("mylist");
System.out.println("LPOP result: " + leftPopped);
System.out.println("List after LPOP: " + jedis.lrange("mylist", 0, -1));
String rightPopped = jedis.rpop("mylist");
System.out.println("RPOP result: " + rightPopped);
System.out.println("List after RPOP: " + jedis.lrange("mylist", 0, -1));
jedis.lrem("mylist", 0, "world");
System.out.println("List after LREM 'world': " + jedis.lrange("mylist", 0, -1));
System.out.println("\n--- Other Operations ---");
String element = jedis.lindex("mylist", 0);
System.out.println("Element at index 0: " + element);
jedis.lset("mylist", 0, "baz");
System.out.println("List after LSET: " + jedis.lrange("mylist", 0, -1));
}
}
Best Practices
- Use a Connection Pool: Creating a new connection for every operation is very inefficient.
JedisPoolmanages a pool of connections, which is the standard and recommended way to use Jedis in any real application. - Use
try-with-resources: As shown in the examples, always usetry-with-resourcesforJedisandJedisPoolto ensure they are closed properly, preventing resource leaks. - Handle Exceptions: Network issues or Redis being down can throw
JedisException. Wrap your Redis calls intry-catchblocks to handle these gracefully. - Atomic Operations with Pipelines: If you need to perform multiple operations atomically (e.g.,
LPUSHand thenPUBLISH), consider using aPipeline. This sends multiple commands over a single connection, reducing network latency.
