Skip to content

redis/lettucemod

Folders and files

NameName
Last commit message
Last commit date

Latest commit

84a3d0a · Mar 26, 2025
Jul 19, 2024
Mar 26, 2025
Oct 17, 2024
Aug 1, 2024
Nov 17, 2021
Nov 25, 2020
Mar 21, 2025
Mar 26, 2025
Mar 21, 2025
Mar 21, 2025
Jul 23, 2024
Jul 23, 2024
Jan 25, 2025
Aug 1, 2024

Repository files navigation

LettuceMod

Build Status Download License Coverage

LettuceMod is a Java client for Redis Stack based on Lettuce. It supports the following Redis Stack features:

Getting Started

Java

Maven
<dependency>
    <groupId>com.redis</groupId>
    <artifactId>lettucemod</artifactId>
    <version>4.2.1</version>
</dependency>
Gradle
dependencies {
    implementation 'com.redis:lettucemod:4.2.1'
}

Spring

Maven
<dependency>
    <groupId>com.redis</groupId>
    <artifactId>lettucemod-spring</artifactId>
    <version>4.2.1</version>
</dependency>
Gradle
dependencies {
    implementation 'com.redis:lettucemod-spring:4.2.1'
}

Snapshot Releases

For early-access releases use the following repository:

Maven
<repositories>
   <repository>
      <id>oss.sonatype.org-snapshot</id>
         <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
         <releases>
            <enabled>false</enabled>
         </releases>
         <snapshots>
           <enabled>true</enabled>
         </snapshots>
   </repository>
</repositories>
Gradle
repositories {
    maven {
        url "https://s01.oss.sonatype.org/content/repositories/snapshots/"
    }
}

Usage

Java

Standalone Client

RedisModulesClient client = RedisModulesClient.create("redis://localhost:6379"); // (1)
StatefulRedisModulesConnection<String, String> connection = client.connect(); // (2)
RedisModulesCommands<String, String> commands = connection.sync(); // (3)
  1. Create a modules client

  2. Connect to Redis server

Cluster Client

List<RedisURI> uris = Arrays.asList(RedisURI.create("node1", 6379), RedisURI.create("node2", 6379)); // (1)
RedisModulesClusterClient client = RedisModulesClusterClient.create(uris); // (2)
StatefulRedisModulesClusterConnection<String, String> connection = client.connect(); // (3)
RedisModulesAdvancedClusterCommands<String, String> commands = connection.sync(); // (4)
  1. Create list of cluster node URIs

  2. Create a cluster client

  3. Connect to Redis servers

  4. Use the sync, async, or reactive API

Connection Pool

GenericObjectPoolConfig<StatefulRedisModulesConnection<String, String>> config = new GenericObjectPoolConfig<>();
config.setMaxTotal(4); // (1)
// ...
GenericObjectPool<StatefulRedisModulesConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(client::connect, config); // (2)
  1. Create a pool configuration

  2. Create the connection pool

Spring

Client

@Component
public class MyComponent {

    @Autowired
    StatefulRedisModulesConnection<String, String> connection;

    // ...
}

Connection Pool

@Component
public class MyComponent {

    @Autowired
    GenericObjectPool<StatefulRedisModulesConnection<String, String>> pool;

    // ...
}

Commands

RedisModulesCommands<String, String> commands = connection.sync();

// JSON.SET
commands.jsonSet("arr", ".", "[1,2,3]");

// FT.CREATE
commands.ftCreate("beers", Field.text("name").build(), Field.numeric("ibu").build());

// FT.SEARCH
commands.ftSearch("beers", "chou*");

// TS.ADD
commands.tsAdd("temp:3:11", Sample.of(1548149181, 30));

// BF.EXISTS
commands.bfExists("bloom:1", "test");

// CF.EXISTS
commands.cfExists("cuckoo:1", "one");

// CMS.QUERY
commands.cmsQuery("cms:1", "one", "two", "three");

// TDIGEST.RANK
commands.tDigestRank("tdigest:1", -5, 100, 5.3);

// TOPK.QUERY
commands.topKQuery("topk:1", "four", "three", "two", "foo");

Pipelining

RedisModulesAsyncCommands<String, String> commands = connection.async();
commands.setAutoFlushCommands(false); // (1)
List<RedisFuture<?>> futures = new ArrayList<>(); // (2)
for (MyEntity element : entities()) {
    futures.add(commands.ftSugadd("names",  Suggestion.of(element.getName(), element.getScore())));
}
commands.flushCommands(); // (3)
boolean result = LettuceFutures.awaitAll(5, TimeUnit.SECONDS,
        futures.toArray(new RedisFuture[0])); // (4)
connection.close(); // (5)
  1. Disable auto-flushing

  2. Perform a series of independent calls

  3. Write all commands to the transport layer

  4. Synchronization example: Wait until all futures complete

  5. Later

Connection Pooling

GenericObjectPoolConfig<StatefulRedisModulesConnection<String, String>> config = new GenericObjectPoolConfig<>(); // (1)
config.setMaxTotal(16);
// ...
GenericObjectPool<StatefulRedisModulesConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(client::connect, config); // (2)
try (StatefulRedisModulesConnection<String, String> connection = pool.borrowObject()) { // (3)
    RedisModulesAsyncCommands<String, String> commands = connection.async(); // (4)
    // ...
} catch (Exception e) {
    log.error("Could not get a connection from the pool", e);
}
  1. Create a pool configuration

  2. Create the connection pool

  3. Get connection from pool. Try-with automatically closes connection which returns it to pool

  4. Use sync, async, or reactive commands