Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
88ab90b
[automatic-failover] Improve extensibility that is needed for automat…
atakavci Nov 11, 2025
00d7b33
[automatic-failover] Draft implementation for automatic-failover (#3508)
atakavci Nov 17, 2025
f0890d9
Merge branch 'main' into feature/automatic-failover-1
atakavci Nov 17, 2025
bec5f28
[automatic-failover] Make AbstractRedisClient implements BaseRedisCl…
atakavci Nov 20, 2025
b6fbc4e
[automatic-failover] Support for dynamic add/remove endpoints (#3517)
atakavci Nov 24, 2025
c2890be
[automatic-failover] Support double-threshold logic with circuitbreak…
atakavci Nov 24, 2025
f7051be
[automatic failover] Implement sliding time window metrics tracker (#…
ggivo Nov 26, 2025
e49708b
[automatic failover] CAE-1861: Atomic lock-free metrics reset on Circ…
ggivo Nov 26, 2025
5f3060f
[automatic-failover] Implement weighted endpoint selection (#3519)
atakavci Nov 26, 2025
be6a0d1
[automatic-failover] Integrate health checks with probing policies an…
ggivo Dec 5, 2025
f152db6
[automatic failover] Integrate circuitbreaker into each DefaultEndpoi…
atakavci Dec 9, 2025
20ea67a
[automatic failover] Implement ping health check (CAE-1687) (#3564)
ggivo Dec 9, 2025
b156944
[automatic failover] Builder APIs for DatabaseConfig and CircuitBreak…
ggivo Dec 11, 2025
bad065d
Remove unused redisURI parameter from PingStrategy constructors (#3573)
ggivo Dec 11, 2025
8d1796f
[automatic failover] Add example for automatic failover (#3568)
uglide Dec 11, 2025
d5870fc
Merge remote-tracking branch 'origin/main' into feature/automatic-fai…
ggivo Dec 11, 2025
4635b33
Merge branch 'main' into feature/automatic-failover-1
ggivo Dec 11, 2025
fd215cf
[automatic failover] Mark APIs as experimental (CAE-2046) (#3574)
ggivo Dec 11, 2025
8ebfb01
update release notes for 7.4.0.BETA1 (#3578)
ggivo Dec 11, 2025
8279fa1
fix : HealthCheckIntegrationTests nested test classes executed as uni…
ggivo Dec 11, 2025
02ba21d
[automatic failover] Record failures for each attempt of write on cha…
atakavci Dec 20, 2025
ebeb77a
[automatic failover] Make ClientOptions per Database(DatabaseConfig) …
atakavci Dec 20, 2025
c8e1491
[automatic failover] Implement thread-safe endpoint switch in Statefu…
atakavci Jan 2, 2026
0cc5c30
Revert accidentally replaced jmh benchmark test includes
ggivo Jan 5, 2026
b41e25a
[automatic failover][lettuce] Expose pluggable listeners interface fo…
ggivo Jan 13, 2026
5ff0966
[automatic failover] Implement async creation support for StatefulRed…
atakavci Jan 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 15 additions & 20 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
Lettuce 7.2.0 RELEASE NOTES
Lettuce 7.4.0.BETA1 RELEASE NOTES
==============================

The Lettuce team is pleased to announce the Lettuce 7.2.0 minor release!
The Lettuce team is pleased to announce the **first beta release of Lettuce 7.4.0**!

Lettuce 7.2.0 supports Redis 2.6+ up to Redis 8.x. In terms of Java runtime, Lettuce requires at least Java 8 and
works with Java 24. The driver is tested against Redis 8.4, Redis 8.2, Redis 8.0, Redis 7.4 and Redis 7.2.
This release introduces **Automatic Client-Side Endpoint Failover** through the newly added **MultiDBClient**.

Thanks to all contributors who made Lettuce 7.2.0.RELEASE possible.
### Key Features

📗 Links
Reference documentation: https://lettuce.io/core/7.2.0.RELEASE/reference/
Javadoc: https://lettuce.io/core/7.2.0.RELEASE/api/
- **Automatic Detection**: The client monitors the health of all configured Redis endpoints.
- **Seamless Failover**: If the active endpoint fails, traffic is automatically rerouted to the next healthiest endpoint based on configurable priorities.
- **Customizable**: Developers can configure endpoints, set priorities, adjust failure sensitivity, and plug in custom health checks or failure detection logic.

⭐ New Features
* Add ftHybrid by @a-TODO-rov in https://github.com/redis/lettuce/pull/3540
* Expose method to add upstream driver libraries to CLIENT SETINFO payload by @viktoriya-kutsarova in https://github.com/redis/lettuce/pull/3542

🐞 Bug Fixes
* SearchArgs.returnField with alias produces malformed redis command #3528 by @tishun in https://github.com/redis/lettuce/pull/3530
* fix consistency with get(int) that returns wrapped DelegateJsonObject/DelegateJsonArray for nested structures by @NeatGuyCoding in https://github.com/redis/lettuce/pull/3464
**Lettuce 7.4.0.BETA1** supports Redis **2.6+** up to Redis **8.x** and requires **Java 8** or newer. The driver is tested against Redis **8.4**, **8.2**, **7.4**, and **7.2**.

💡 Other
* Bumping Netty to 4.2.5.Final (main) by @tishun in https://github.com/redis/lettuce/pull/3536

❤️ New Contributors
* @NeatGuyCoding made their first contribution in https://github.com/redis/lettuce/pull/3464
* @viktoriya-kutsarova made their first contribution in https://github.com/redis/lettuce/pull/3542

**Full Changelog**: https://github.com/redis/lettuce/compare/7.1.0.RELEASE...7.2.0.RELEASE
We encourage you to try out this beta and provide feedback ahead of the general availability release.

**Full Changelog**: https://github.com/redis/lettuce/compare/7.2.0.RELEASE...7.4.0.BETA1

## Contributors
We'd like to thank all the contributors who worked on this release!
@atakavci, @ggivo, @uglide
11 changes: 10 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@

<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>7.3.0-SNAPSHOT</version>
<version>7.4.0-SNAPSHOT</version>

<packaging>jar</packaging>

<name>Lettuce</name>
Expand Down Expand Up @@ -565,6 +566,14 @@
<scope>test</scope>
</dependency>

<!-- Toxiproxy for network failure simulation -->
<dependency>
<groupId>eu.rekawek.toxiproxy</groupId>
<artifactId>toxiproxy-java</artifactId>
<version>2.1.11</version>
<scope>test</scope>
</dependency>

<!-- JMH -->

<dependency>
Expand Down
12 changes: 11 additions & 1 deletion src/main/java/io/lettuce/core/AbstractRedisClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import java.util.concurrent.atomic.AtomicInteger;

import io.lettuce.core.MaintNotificationsConfig.EndpointTypeSource;
import io.lettuce.core.api.BaseRedisClient;
import reactor.core.publisher.Mono;
import io.lettuce.core.event.command.CommandListener;
import io.lettuce.core.event.connection.ConnectEvent;
Expand Down Expand Up @@ -82,7 +83,7 @@
* @see ClientResources
* @see DefaultClientResources
*/
public abstract class AbstractRedisClient implements AutoCloseable {
public abstract class AbstractRedisClient implements BaseRedisClient {

private static final InternalLogger logger = InternalLoggerFactory.getInstance(AbstractRedisClient.class);

Expand Down Expand Up @@ -176,6 +177,7 @@ protected int getResourceCount() {
*
* @param listener must not be {@code null}.
*/
@Override
public void addListener(RedisConnectionStateListener listener) {

LettuceAssert.notNull(listener, "RedisConnectionStateListener must not be null");
Expand All @@ -187,6 +189,7 @@ public void addListener(RedisConnectionStateListener listener) {
*
* @param listener must not be {@code null}.
*/
@Override
public void removeListener(RedisConnectionStateListener listener) {

LettuceAssert.notNull(listener, "RedisConnectionStateListener must not be null");
Expand All @@ -199,6 +202,7 @@ public void removeListener(RedisConnectionStateListener listener) {
* @param listener must not be {@code null}.
* @since 6.1
*/
@Override
public void addListener(CommandListener listener) {

LettuceAssert.notNull(listener, "CommandListener must not be null");
Expand All @@ -211,6 +215,7 @@ public void addListener(CommandListener listener) {
* @param listener must not be {@code null}.
* @since 6.1
*/
@Override
public void removeListener(CommandListener listener) {

LettuceAssert.notNull(listener, "CommandListener must not be null");
Expand Down Expand Up @@ -448,6 +453,7 @@ private void initializeChannelAsync0(ConnectionBuilder connectionBuilder, Comple
*
* @see EventExecutorGroup#shutdownGracefully(long, long, TimeUnit)
*/
@Override
public void shutdown() {
shutdown(0, 2, TimeUnit.SECONDS);
}
Expand All @@ -468,6 +474,7 @@ public void close() {
* @since 5.0
* @see EventExecutorGroup#shutdownGracefully(long, long, TimeUnit)
*/
@Override
public void shutdown(Duration quietPeriod, Duration timeout) {
shutdown(quietPeriod.toNanos(), timeout.toNanos(), TimeUnit.NANOSECONDS);
}
Expand All @@ -483,6 +490,7 @@ public void shutdown(Duration quietPeriod, Duration timeout) {
* @param timeUnit the unit of {@code quietPeriod} and {@code timeout}.
* @see EventExecutorGroup#shutdownGracefully(long, long, TimeUnit)
*/
@Override
public void shutdown(long quietPeriod, long timeout, TimeUnit timeUnit) {

try {
Expand All @@ -501,6 +509,7 @@ public void shutdown(long quietPeriod, long timeout, TimeUnit timeUnit) {
* @since 4.4
* @see EventExecutorGroup#shutdownGracefully(long, long, TimeUnit)
*/
@Override
public CompletableFuture<Void> shutdownAsync() {
return shutdownAsync(0, 2, TimeUnit.SECONDS);
}
Expand All @@ -517,6 +526,7 @@ public CompletableFuture<Void> shutdownAsync() {
* @since 4.4
* @see EventExecutorGroup#shutdownGracefully(long, long, TimeUnit)
*/
@Override
public CompletableFuture<Void> shutdownAsync(long quietPeriod, long timeout, TimeUnit timeUnit) {

if (shutdown.compareAndSet(false, true)) {
Expand Down
Loading
Loading