LettuceMod is a Java client for Redis Stack based on Lettuce. It supports the following Redis Stack features:
-
JSON data type (storing, updating, and fetching)
-
Search and query of hashes and JSON documents
-
Time series data support
<dependency>
<groupId>com.redis</groupId>
<artifactId>lettucemod</artifactId>
<version>3.8.0</version>
</dependency>
dependencies {
implementation 'com.redis:lettucemod:3.8.0'
}
<dependency>
<groupId>com.redis</groupId>
<artifactId>spring-lettucemod</artifactId>
<version>3.8.0</version>
</dependency>
dependencies {
implementation 'com.redis:spring-lettucemod:3.8.0'
}
For early-access releases use the following repository:
<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>
repositories {
maven {
url "https://s01.oss.sonatype.org/content/repositories/snapshots/"
}
}
RedisModulesClient client = RedisModulesClient.create("redis://localhost:6379"); // (1)
StatefulRedisModulesConnection<String, String> connection = client.connect(); // (2)
RedisModulesCommands<String, String> commands = connection.sync(); // (3)
-
Create a modules client
-
Connect to Redis server
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)
-
Create list of cluster node URIs
-
Create a cluster client
-
Connect to Redis servers
-
Use the sync, async, or reactive API
GenericObjectPoolConfig<StatefulRedisModulesConnection<String, String>> config = new GenericObjectPoolConfig<>();
config.setMaxTotal(4); // (1)
// ...
GenericObjectPool<StatefulRedisModulesConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(client::connect, config); // (2)
-
Create a pool configuration
-
Create the connection pool
@Component
public class MyComponent {
@Autowired
StatefulRedisModulesConnection<String, String> connection;
// ...
}
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");
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)
-
Disable auto-flushing
-
Perform a series of independent calls
-
Write all commands to the transport layer
-
Synchronization example: Wait until all futures complete
-
Later
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);
}
-
Create a pool configuration
-
Create the connection pool
-
Get connection from pool. Try-with automatically closes connection which returns it to pool
-
Use sync, async, or reactive commands