Spring boot Redis || difference between LettuceConnectionFactory and JedisConnectionFactory

A cup of JAVA coffee with NeeSri
3 min readJan 27, 2024

--

Both LettuceConnectionFactory and JedisConnectionFactory are implementations of the ConnectionFactory interface in Spring Data Redis, providing the means to create connections to a Redis server. Let's explore the differences between the two with examples:

1. Underlying Redis Clients:

LettuceConnectionFactory:

  • Uses Lettuce as the underlying Redis client.
  • Lettuce is a scalable, thread-safe Redis client for Java.
  • It provides a reactive, non-blocking API, making it suitable for reactive and asynchronous applications.
  • Supports connection pooling, which can improve performance and scalability in multi-threaded environments.

1. Maven Dependency:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce.core</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>

2. Java Configuration:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;

@Configuration
public class RedisConfig {

@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory("localhost", 6379);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class LettuceExampleService {

private final RedisTemplate<String, String> redisTemplate;

@Autowired
public LettuceExampleService(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}

public void setValue(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}

public String getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
}

JedisConnectionFactory:

  • Uses Jedis as the underlying Redis client.
  • Jedis is a simple, single-threaded Redis client for Java.
  • It provides a blocking API, meaning each request blocks until a response is received.
  • Does not natively support connection pooling. However, it is possible to use Jedis with connection pooling libraries like Apache Commons Pool.
  1. Maven Dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>

2. Java Configuration:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

@Configuration
public class RedisConfig {

@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new JedisConnectionFactory();
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class JedisExampleService {

private final RedisTemplate<String, String> redisTemplate;

@Autowired
public JedisExampleService(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}

public void setValue(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}

public String getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
}

2. Performance and Scalability:

LettuceConnectionFactory:

  • Generally considered to be more performant and scalable compared to Jedis, especially in multi-threaded environments.
  • Supports asynchronous and reactive programming models, which can improve performance in high-concurrency scenarios.
  • Provides built-in connection pooling, reducing the overhead of establishing and closing connections.

JedisConnectionFactory:

  • May have limitations in terms of performance and scalability compared to Lettuce, especially in multi-threaded scenarios.
  • Since Jedis is single-threaded, it may not fully utilize available CPU resources in multi-core environments.

3. Configuration Options:

LettuceConnectionFactory:

  • Provides various configuration options for tuning connection pooling, timeout settings, SSL/TLS support, etc.
  • Supports reactive programming and integration with Spring’s reactive stack (e.g., WebFlux).

JedisConnectionFactory:

  • Provides configuration options similar to LettuceConnectionFactory but may have fewer advanced features.
  • Does not natively support reactive programming but can be used with reactive libraries through compatibility layers.

4. Dependencies and Compatibility:

LettuceConnectionFactory:

  • May require additional dependencies related to reactive programming (e.g., Reactor) if used in a reactive application.
  • Suitable for modern Spring applications, especially those utilizing reactive programming.

JedisConnectionFactory:

  • Typically has fewer dependencies and may be simpler to integrate into existing Spring applications.
  • May be preferred for legacy applications or those not requiring advanced features like reactive programming.

Summary:

Use LettuceConnectionFactory when:

  • Building modern, high-performance, and scalable Spring applications.
  • Working with reactive programming and asynchronous APIs.
  • Needing advanced features like connection pooling and SSL/TLS support.

Use JedisConnectionFactory when:

  • Working with legacy or simple Spring applications.
  • Preferring simplicity and ease of integration over advanced features.
  • Not requiring reactive programming or asynchronous APIs.

--

--

No responses yet