Example: Lettuce config for cluster mode, TLS enabled - Amazon ElastiCache

Example: Lettuce config for cluster mode, TLS enabled

Note

Timeouts in the following example are for tests that ran SET/GET commands with keys and values up to 20 bytes long. The processing time can be longer when the commands are complex or the keys and values are larger. You should set the timeouts based on the use case of your application.

// Set DNS cache TTL public void setJVMProperties() { java.security.Security.setProperty("networkaddress.cache.ttl", "10"); } private static final Duration META_COMMAND_TIMEOUT = Duration.ofMillis(1000); private static final Duration DEFAULT_COMMAND_TIMEOUT = Duration.ofMillis(250); // Socket connect timeout should be lower than command timeout for Lettuce private static final Duration CONNECT_TIMEOUT = Duration.ofMillis(100); // Create RedisURI from the cluster configuration endpoint clusterConfigurationEndpoint = <cluster-configuration-endpoint> // TODO: add your cluster configuration endpoint final RedisURI redisUriCluster = RedisURI.Builder.redis(clusterConfigurationEndpoint) .withPort(6379) .withSsl(true) .build(); // Configure the client's resources ClientResources clientResources = DefaultClientResources.builder() .reconnectDelay( Delay.fullJitter( Duration.ofMillis(100), // minimum 100 millisecond delay Duration.ofSeconds(10), // maximum 10 second delay 100, TimeUnit.MILLISECONDS)) // 100 millisecond base .dnsResolver(new DirContextDnsResolver()) .build(); // Create a cluster client instance with the URI and resources RedisClusterClient redisClusterClient = RedisClusterClient.create(clientResources, redisUriCluster); // Use a dynamic timeout for commands, to avoid timeouts during // cluster management and slow operations. class DynamicClusterTimeout extends TimeoutSource { private static final Set<ProtocolKeyword> META_COMMAND_TYPES = ImmutableSet.<ProtocolKeyword>builder() .add(CommandType.FLUSHDB) .add(CommandType.FLUSHALL) .add(CommandType.CLUSTER) .add(CommandType.INFO) .add(CommandType.KEYS) .build(); private final Duration metaCommandTimeout; private final Duration defaultCommandTimeout; DynamicClusterTimeout(Duration defaultTimeout, Duration metaTimeout) { defaultCommandTimeout = defaultTimeout; metaCommandTimeout = metaTimeout; } @Override public long getTimeout(RedisCommand<?, ?, ?> command) { if (META_COMMAND_TYPES.contains(command.getType())) { return metaCommandTimeout.toMillis(); } return defaultCommandTimeout.toMillis(); } } TimeoutOptions timeoutOptions = TimeoutOptions.builder() .timeoutSource(new DynamicClusterTimeout(DEFAULT_COMMAND_TIMEOUT, META_COMMAND_TIMEOUT)) .build(); // Configure the topology refreshment optionts final ClusterTopologyRefreshOptions topologyOptions = ClusterTopologyRefreshOptions.builder() .enableAllAdaptiveRefreshTriggers() .enablePeriodicRefresh() .dynamicRefreshSources(true) .build(); // Configure the socket options final SocketOptions socketOptions = SocketOptions.builder() .connectTimeout(CONNECT_TIMEOUT) .keepAlive(true) .build(); // Configure the client's options final ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder() .topologyRefreshOptions(topologyOptions) .socketOptions(socketOptions) .autoReconnect(true) .timeoutOptions(timeoutOptions) .nodeFilter(it -> ! (it.is(RedisClusterNode.NodeFlag.FAIL) || it.is(RedisClusterNode.NodeFlag.EVENTUAL_FAIL) || it.is(RedisClusterNode.NodeFlag.NOADDR))) .validateClusterNodeMembership(false) .build(); redisClusterClient.setOptions(clusterClientOptions); // Get a connection final StatefulRedisClusterConnection<String, String> connection = redisClusterClient.connect(); // Get cluster sync/async commands RedisAdvancedClusterCommands<String, String> sync = connection.sync(); RedisAdvancedClusterAsyncCommands<String, String> async = connection.async();