diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index ce2499421..d179a896c 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -8,6 +8,12 @@ and this project adheres to https://semver.org/spec/v2.0.0.html[Semantic Version == [Unreleased] +=== Added +- Added Redis Sentinel and Redis Cluster configuration at JNoSQL Redis Database API + +=== Fixed +- Fixed the broken connection issue at JNoSQL Redis Database API + == [1.1.2] - 2023-09-15 === Added diff --git a/README.adoc b/README.adoc index 5ba1f3c4e..f457690bd 100644 --- a/README.adoc +++ b/README.adoc @@ -1470,52 +1470,158 @@ You can use either the Maven or Gradle dependencies: === Configuration -This API provides the ```RedisConfigurations``` class to programmatically establish the credentials. +This is an example using Redis's Key-Value API with MicroProfile Config. Please note that you can establish properties using the https://microprofile.io/microprofile-config/[MicroProfile Config] specification. -[cols="Redis"] -|=== -|Configuration property |Description +[source,properties] +---- +jnosql.keyvalue.provider=org.eclipse.jnosql.databases.redis.communication.RedisConfiguration +jnosql.keyvalue.database=heroes +---- -|`jnosql.redis.host` -|The database host +This API provides enum classes to programmatically establish the credentials as: -|`jnosql.redis.port` -|The database port +- link:README.adoc#_single_node_configuration[`RedisConfigurations`] for single node configuration ++ +[source,properties] +---- +# Single Node Configuration -|`jnosql.redis.timeout` -|The redis timeout, the default value 2000 on milliseconds +# by default the host is localhost +jnosql.redis.host=localhost +# by default the port is 6379 +jnosql.redis.port=6379 +# if you have user +jnosql.redis.user=youruser +# if you have password +jnosql.redis.password=yourpassword +---- -|`jnosql.redis.password` -|The user's password +- link:README.adoc#_redis_sentinel_configuration[`RedisSentinelConfigurations`] for sentinel configuration ++ +[source,properties] +---- +# Sentinel Configuration +jnosql.redis.sentinel.hosts=host1:26379,host2:26379 + +jnosql.redis.sentinel.master.name=masterName +jnosql.redis.sentinel.master.user=masterUser +jnosql.redis.sentinel.master.password=masterPassword +#jnosql.redis.sentinel.master.ssl=false +#jnosql.redis.sentinel.master.timeout=2000 +#jnosql.redis.sentinel.master.connection.timeout=2000 +#jnosql.redis.sentinel.master.socket.timeout=2000 + +jnosql.redis.sentinel.slave.user=slaveUser +jnosql.redis.sentinel.slave.password=slavePassword +#jnosql.redis.sentinel.slave.ssl=false +#jnosql.redis.sentinel.slave.timeout=2000 +#jnosql.redis.sentinel.slave.connection.timeout=2000 +#jnosql.redis.sentinel.slave.socket.timeout=2000 +---- + +- link:README.adoc#_redis_sentinel_configuration[`RedisClusterConfigurations`] for cluster configuration ++ +[source,properties] +---- +# Cluster Configuration -|`jnosql.redis.database` -|The redis database number, the default value is 0 +jnosql.redis.cluster.hosts=host1:6379,host2:6379 +jnosql.redis.cluster.user=clusterUser +jnosql.redis.cluster.password=clusterPassword +jnosql.redis.cluster.client.name=clusterClientName +jnosql.redis.cluster.max.attempts=5 +jnosql.redis.cluster.max.total.retries.duration=10000 +#jnosql.redis.cluster.ssl=false +#jnosql.redis.cluster.timeout=2000 +#jnosql.redis.cluster.connection.timeout=2000 +#jnosql.redis.cluster.socket.timeout=2000 +---- -|`jnosql.redis.client.name` -|The client's name +==== Single Node Configuration + +This API provides the `RedisConfigurations` class to programmatically establish the credentials. +Please note that you can establish properties using the https://microprofile.io/microprofile-config/[MicroProfile Config] specification. -|`jnosql.redis.max.total` -|The value for the maxTotal configuration attribute for pools created with this configuration instance, the default value 1000. +[cols="2,2", options="header"] +|=== +|Configuration property |Description -|`jnosql.redis.max.idle` -|The value for the maxIdle configuration attribute for pools created with this configuration instance, the default value 10. +|`jnosql.redis.host` |The database host +|`jnosql.redis.port` |The database port +|`jnosql.redis.timeout` |The redis timeout, the default value is 2000 milliseconds +|`jnosql.redis.password` |The password's credential +|`jnosql.redis.database` |The redis database number +|`jnosql.redis.client.name` |The cluster client's name. The default value is 0. +|`jnosql.redis.max.total` |The value for the maxTotal configuration attribute for pools created with this configuration instance. The default value is 1000. +|`jnosql.redis.max.idle` |The value for the maxIdle configuration attribute for pools created with this configuration instance. The default value is 10. +|`jnosql.redis.min.idle` |The value for the minIdle configuration attribute for pools created with this configuration instance. The default value is 1. +|`jnosql.redis.max.wait.millis` |The value for the maxWait configuration attribute for pools created with this configuration instance. The default value is 3000 milliseconds. +|`jnosql.redis.connection.timeout` |The connection timeout in milliseconds configuration attribute for the jedis client configuration created with this configuration instance. +|`jnosql.redis.socket.timeout` |The socket timeout in milliseconds configuration attribute for the jedis client configuration with this configuration instance. +|`jnosql.redis.user` |The user configuration attribute for the jedis client configuration with this configuration instance. +|`jnosql.redis.ssl` |The ssl configuration attribute for the jedis client configuration with this configuration instance. The default value is false. +|`jnosql.redis.protocol` |The protocol configuration attribute for the jedis client configuration with this configuration instance. +|`jnosql.redis.clientset.info.config.disabled` |The clientset info disabled configuration attribute for the jedis client configuration with this configuration instance. The default value is false. +|`jnosql.redis.clientset.info.config.libname.suffix` |The clientset info configuration libname suffix attribute for the jedis client configuration with this configuration instance. +|=== -|`jnosql.redis.min.idle` -|The value for the minIdle configuration attribute for pools created with this configuration instance, the default value 1. +==== Redis Sentinel Configuration -|`jnosql.redis.max.wait.millis` -|The value for the maxWait configuration attribute for pools created with this configuration instance, the default value 3000. +This API provides the `RedisSentinelConfigurations` class to programmatically establish the credentials. +Please note that you can establish properties using the https://microprofile.io/microprofile-config/[MicroProfile Config] specification. +[cols="2,2", options="header"] +|=== +|Configuration Property |Description + +|`jnosql.redis.sentinel.hosts` |The value for the sentinel HOST:PORT (separated by comma) configuration attribute for the jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.master.name` |The value for the master name configuration attribute for the jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.master.client.name` |The master client's name, the default value is 0 +|`jnosql.redis.sentinel.slave.client.name` |The slave client's name, the default value is 0 +|`jnosql.redis.sentinel.master.timeout` |The master redis timeout, the default value is 2000 milliseconds +|`jnosql.redis.sentinel.slave.timeout` |The slave redis timeout, the default value is 2000 milliseconds +|`jnosql.redis.sentinel.master.connection.timeout` |The connection timeout in milliseconds configuration attribute for the master jedis client configuration created with this configuration instance. +|`jnosql.redis.sentinel.slave.connection.timeout` |The connection timeout in milliseconds configuration attribute for the slave jedis client configuration created with this configuration instance. +|`jnosql.redis.sentinel.master.socket.timeout` |The socket timeout in milliseconds configuration attribute for the master jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.slave.socket.timeout` |The socket timeout in milliseconds configuration attribute for the slave jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.master.user` |The user configuration attribute for the master jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.slave.user` |The user configuration attribute for the slave jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.master.password` |The password configuration attribute for the master jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.slave.password` |The password configuration attribute for the slave jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.master.ssl` |The ssl configuration attribute for the master jedis client configuration with this configuration instance. The default value is false. +|`jnosql.redis.sentinel.slave.ssl` |The ssl configuration attribute for the slave jedis client configuration with this configuration instance. The default value is false. +|`jnosql.redis.sentinel.master.protocol` |The protocol configuration attribute for the master jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.slave.protocol` |The protocol configuration attribute for the slave jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.master.clientset.info.config.disabled` |The clientset info disabled configuration attribute for the master jedis client configuration with this configuration instance. The default value is false. +|`jnosql.redis.sentinel.slave.clientset.info.config.disabled` |The clientset info disabled configuration attribute for the slave jedis client configuration with this configuration instance. The default value is false. +|`jnosql.redis.sentinel.master.clientset.info.config.libname.suffix` |The clientset info configuration libname suffix attribute for the master jedis client configuration with this configuration instance. +|`jnosql.redis.sentinel.slave.clientset.info.config.libname.suffix` |The clientset info configuration libname suffix attribute for the slave jedis client configuration with this configuration instance. |=== -This is an example using Redis's Key-Value API with MicroProfile Config. +==== Redis Cluster Configuration -[source,properties] ----- -jnosql.keyvalue.provider=org.eclipse.jnosql.databases.redis.communication.RedisConfiguration -jnosql.keyvalue.database=heroes ----- +This API provides the `RedisClusterConfigurations` class to programmatically establish the credentials. +Please note that you can establish properties using the https://microprofile.io/microprofile-config/[MicroProfile Config] specification. + +[cols="2,2", options="header"] +|=== +|Configuration Property |Description + +|`jnosql.redis.cluster.hosts` |The value for the sentinel HOST:PORT (separated by comma) configuration attribute for the jedis client configuration with this configuration instance. +|`jnosql.redis.cluster.client.name` |The cluster client's name. The default value is 0. +|`jnosql.redis.cluster.timeout` |The cluster redis timeout, the default value is 2000 milliseconds +|`jnosql.redis.cluster.connection.timeout` |The connection timeout in milliseconds configuration attribute for the cluster jedis client configuration created with this configuration instance. +|`jnosql.redis.cluster.socket.timeout` |The socket timeout in milliseconds configuration attribute for the cluster jedis client configuration with this configuration instance. +|`jnosql.redis.cluster.user` |The user configuration attribute for the cluster jedis client configuration with this configuration instance. +|`jnosql.redis.cluster.password` |The password configuration attribute for the cluster jedis client configuration with this configuration instance. +|`jnosql.redis.cluster.ssl` |The ssl configuration attribute for the cluster jedis client configuration with this configuration instance. The default value is false. +|`jnosql.redis.cluster.protocol` |The protocol configuration attribute for the cluster jedis client configuration with this configuration instance. +|`jnosql.redis.cluster.clientset.info.config.disabled` |The clientset info disabled configuration attribute for the cluster jedis client configuration with this configuration instance. The default value is false. +|`jnosql.redis.cluster.clientset.info.config.libname.suffix` |The clientset info configuration libname suffix attribute for the cluster jedis client configuration with this configuration instance. +|`jnosql.redis.cluster.max.attempts` |The value for the max attempts configuration attribute for the cluster jedis client configuration with this configuration instance. Default is 5. +|`jnosql.redis.cluster.max.total.retries.duration` |The value for the max total retries configuration attribute for the cluster jedis client configuration with this configuration instance. Default is 10000 milliseconds. +|=== === RedisBucketManagerFactory diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/Counter.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/Counter.java index 25accae12..91e89902c 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/Counter.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/Counter.java @@ -23,6 +23,8 @@ public interface Counter { /** + * Returns the counter value + * * @return The counter value */ Number get(); diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultCounter.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultCounter.java index 90a44362f..0f323ba6b 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultCounter.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultCounter.java @@ -14,7 +14,7 @@ */ package org.eclipse.jnosql.databases.redis.communication; -import redis.clients.jedis.Jedis; +import redis.clients.jedis.UnifiedJedis; import java.time.Duration; import java.util.Objects; @@ -32,14 +32,13 @@ class DefaultCounter implements Counter { private final String key; - private Jedis jedis; + private final UnifiedJedis jedis; - DefaultCounter(String key, Jedis jedis) { + DefaultCounter(String key, UnifiedJedis jedis) { this.key = key; this.jedis = jedis; } - @Override public Number get() { return Optional.ofNullable(jedis.get(key)) diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultRedisBucketManagerFactory.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultRedisBucketManagerFactory.java index 78114f9ee..794bbc95a 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultRedisBucketManagerFactory.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultRedisBucketManagerFactory.java @@ -16,7 +16,7 @@ import jakarta.json.bind.Jsonb; import org.eclipse.jnosql.communication.driver.JsonbSupplier; -import redis.clients.jedis.JedisPool; +import redis.clients.jedis.UnifiedJedis; import java.util.List; import java.util.Map; @@ -29,10 +29,10 @@ class DefaultRedisBucketManagerFactory implements RedisBucketManagerFactory { private static final Jsonb JSON = JsonbSupplier.getInstance().get(); - private final JedisPool jedisPool; + private final UnifiedJedis jedis; - DefaultRedisBucketManagerFactory(JedisPool jedisPool) { - this.jedisPool = jedisPool; + DefaultRedisBucketManagerFactory(UnifiedJedis jedis) { + this.jedis = jedis; } @@ -40,59 +40,59 @@ class DefaultRedisBucketManagerFactory implements RedisBucketManagerFactory { public RedisBucketManager apply(String bucketName) { requireNonNull(bucketName, "bucket name is required"); - return new RedisBucketManager(bucketName, JSON, jedisPool.getResource()); + return new RedisBucketManager(bucketName, JSON, jedis); } @Override public List getList(String bucketName, Class clazz) { requireNonNull(bucketName, "bucket name is required"); requireNonNull(clazz, "Class type is required"); - return new RedisList<>(jedisPool.getResource(), clazz, bucketName); + return new RedisList<>(jedis, clazz, bucketName); } @Override public Set getSet(String bucketName, Class clazz) { requireNonNull(bucketName, "bucket name is required"); requireNonNull(clazz, "Class type is required"); - return new RedisSet<>(jedisPool.getResource(), clazz, bucketName); + return new RedisSet<>(jedis, clazz, bucketName); } @Override public Queue getQueue(String bucketName, Class clazz) { requireNonNull(bucketName, "bucket name is required"); requireNonNull(clazz, "Class type is required"); - return new RedisQueue<>(jedisPool.getResource(), clazz, bucketName); + return new RedisQueue<>(jedis, clazz, bucketName); } @Override public Map getMap(String bucketName, Class keyValue, Class valueValue) { requireNonNull(bucketName, "bucket name is required"); requireNonNull(valueValue, "Class type is required"); - return new RedisMap<>(jedisPool.getResource(), keyValue, valueValue, bucketName); + return new RedisMap<>(jedis, keyValue, valueValue, bucketName); } @Override public SortedSet getSortedSet(String key) throws NullPointerException { requireNonNull(key, "key is required"); - return new DefaultSortedSet(jedisPool.getResource(), key); + return new DefaultSortedSet(jedis, key); } @Override public Counter getCounter(String key) throws NullPointerException { requireNonNull(key, "key is required"); - return new DefaultCounter(key, jedisPool.getResource()); + return new DefaultCounter(key, jedis); } @Override public void close() { - jedisPool.close(); + jedis.close(); } @Override public String toString() { final StringBuilder sb = new StringBuilder("RedisBucketManagerFactory{"); - sb.append("jedisPool=").append(jedisPool); + sb.append("jedisPool=").append(jedis); sb.append('}'); return sb.toString(); } diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultSortedSet.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultSortedSet.java index 3487bf2d7..9f0ee426f 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultSortedSet.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/DefaultSortedSet.java @@ -16,7 +16,7 @@ package org.eclipse.jnosql.databases.redis.communication; -import redis.clients.jedis.Jedis; +import redis.clients.jedis.UnifiedJedis; import java.time.Duration; import java.util.List; @@ -33,9 +33,9 @@ class DefaultSortedSet implements SortedSet { private static final int LAST_ELEMENT = -1; private String key; - private Jedis jedis; + private UnifiedJedis jedis; - DefaultSortedSet(Jedis jedis, String keyspace) { + DefaultSortedSet(UnifiedJedis jedis, String keyspace) { Objects.requireNonNull(jedis, "jedis is required"); Objects.requireNonNull(keyspace, "keyspace is required"); this.key = keyspace; diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisBucketManager.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisBucketManager.java index 0ac2ab174..2f5dfb9b9 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisBucketManager.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisBucketManager.java @@ -21,7 +21,7 @@ import org.eclipse.jnosql.communication.driver.ValueJSON; import org.eclipse.jnosql.communication.keyvalue.BucketManager; import org.eclipse.jnosql.communication.keyvalue.KeyValueEntity; -import redis.clients.jedis.Jedis; +import redis.clients.jedis.UnifiedJedis; import java.time.Duration; import java.util.Objects; @@ -38,9 +38,9 @@ public class RedisBucketManager implements BucketManager { private final String nameSpace; private final Jsonb jsonB; - private final Jedis jedis; + private final UnifiedJedis jedis; - RedisBucketManager(String nameSpace, Jsonb provider, Jedis jedis) { + RedisBucketManager(String nameSpace, Jsonb provider, UnifiedJedis jedis) { this.nameSpace = nameSpace; this.jsonB = provider; this.jedis = jedis; diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisClusterConfigurations.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisClusterConfigurations.java new file mode 100644 index 000000000..758f3c52c --- /dev/null +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisClusterConfigurations.java @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Maximillian Arruda + */ + +package org.eclipse.jnosql.databases.redis.communication; + +import java.util.function.Supplier; + +/** + * An enumeration to show the available options to connect to the Redis database by cluster configuration. + * It implements {@link Supplier}, where its it returns the property name that might be + * overwritten by the system environment using Eclipse Microprofile or Jakarta Config API. + * + * @see org.eclipse.jnosql.communication.Settings + */ +public enum RedisClusterConfigurations implements Supplier { + /** + * The key property that defines if the redis cluster configuration should be loaded + */ + CLUSTER("jnosql.redis.cluster"), + /** + * The value for the sentinel HOST:PORT (separated by comma) configuration attribute for the jedis client configuration with this configuration instance. + */ + CLUSTER_HOSTS("jnosql.redis.cluster.hosts"), + /** + * The cluster client's name. The default value is 0. + */ + CLIENT_NAME("jnosql.redis.cluster.client.name"), + /** + * The cluster redis timeout, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} on milliseconds + */ + TIMEOUT("jnosql.redis.cluster.timeout"), + /** + * The value for the connection timeout in milliseconds configuration attribute for the cluster jedis client configuration + * created with this configuration instance. + * The connection timeout on millis on {@link redis.clients.jedis.JedisClientConfig}, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} + */ + CONNECTION_TIMEOUT("jnosql.redis.cluster.connection.timeout"), + /** + * The value for the socket timeout in milliseconds configuration attribute for the cluster jedis client configuration with + * this configuration instance. + * The socket timeout on millis on {@link redis.clients.jedis.JedisClientConfig}, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} + */ + SOCKET_TIMEOUT("jnosql.redis.cluster.socket.timeout"), + /** + * The value for the user configuration attribute for the cluster jedis client configuration with this configuration instance. + * The user on {@link redis.clients.jedis.JedisClientConfig} + */ + USER("jnosql.redis.cluster.user"), + /** + * The value for the password configuration attribute for the cluster jedis client configuration with this configuration instance. + * The user on {@link redis.clients.jedis.JedisClientConfig} + */ + PASSWORD("jnosql.redis.cluster.password"), + /** + * The value for the ssl configuration attribute for the cluster jedis client configuration with this configuration instance. + * The ssl on {@link redis.clients.jedis.JedisClientConfig}, the default value is false. + */ + SSL("jnosql.redis.cluster.ssl"), + /** + * The value for the protocol configuration attribute for the cluster jedis client configuration with this configuration instance. + * The ssl on {@link redis.clients.jedis.JedisClientConfig}. The default value is false. + * The default value is not defined. + */ + REDIS_PROTOCOL("jnosql.redis.cluster.protocol"), + /** + * The value for the clientset info disabled configuration attribute for the cluster jedis client configuration with this configuration instance. + * The clientset info disabled on {@link redis.clients.jedis.JedisClientConfig} + * The default value is false. + */ + CLIENTSET_INFO_CONFIG_DISABLED("jnosql.redis.cluster.clientset.info.config.disabled"), + /** + * The value for the clientset info configuration libname suffix attribute for the cluster jedis client configuration with this configuration instance. + * The clientset info libname suffix on {@link redis.clients.jedis.JedisClientConfig} + * The default value is not defined. + */ + CLIENTSET_INFO_CONFIG_LIBNAME_SUFFIX("jnosql.redis.cluster.clientset.info.config.libname.suffix"), + + /** + * The value for the max attempts configuration attribute for the cluster jedis client configuration with this configuration instance. + * Default is {@link redis.clients.jedis.JedisCluster#DEFAULT_MAX_ATTEMPTS} + */ + CLUSTER_MAX_ATTEMPTS("jnosql.redis.cluster.max.attempts"), + /** + * The value for the max total retries configuration attribute for the cluster jedis client configuration with this configuration instance. + * Default is {@link RedisClusterConfigurations#SOCKET_TIMEOUT} * {@link RedisClusterConfigurations#CLUSTER_MAX_ATTEMPTS} + */ + CLUSTER_MAX_TOTAL_RETRIES_DURATION("jnosql.redis.cluster.max.total.retries.duration"); + + private final String configuration; + + RedisClusterConfigurations(String configuration) { + this.configuration = configuration; + } + + @Override + public String get() { + return configuration; + } + + public static enum ClusterConfigurationsResolver implements + RedisConfigurationsResolver { + + INSTANCE; + + @Override + public Supplier connectionTimeoutSupplier() { + return RedisClusterConfigurations.CONNECTION_TIMEOUT; + } + + @Override + public Supplier socketTimeoutSupplier() { + return RedisClusterConfigurations.SOCKET_TIMEOUT; + } + + @Override + public Supplier clientNameSupplier() { + return RedisClusterConfigurations.CLIENT_NAME; + } + + @Override + public Supplier userSupplier() { + return RedisClusterConfigurations.USER; + } + + @Override + public Supplier passwordSupplier() { + return RedisClusterConfigurations.PASSWORD; + } + + @Override + public Supplier timeoutSupplier() { + return RedisClusterConfigurations.TIMEOUT; + } + + @Override + public Supplier sslSupplier() { + return RedisClusterConfigurations.SSL; + } + + @Override + public Supplier redisProtocolSupplier() { + return RedisClusterConfigurations.REDIS_PROTOCOL; + } + + @Override + public Supplier clientsetInfoConfigLibNameSuffixSupplier() { + return RedisClusterConfigurations.CLIENTSET_INFO_CONFIG_LIBNAME_SUFFIX; + } + + @Override + public Supplier clientsetInfoConfigDisabled() { + return RedisClusterConfigurations.CLIENTSET_INFO_CONFIG_DISABLED; + } + } + +} \ No newline at end of file diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisCollection.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisCollection.java index 5d3e282cc..3ebcb35d0 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisCollection.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisCollection.java @@ -17,7 +17,7 @@ import jakarta.json.bind.Jsonb; import org.eclipse.jnosql.communication.driver.JsonbSupplier; -import redis.clients.jedis.Jedis; +import redis.clients.jedis.UnifiedJedis; import java.util.ArrayList; import java.util.Collection; @@ -33,13 +33,11 @@ abstract class RedisCollection implements Collection { protected final String keyWithNameSpace; - protected final Jedis jedis; + protected final UnifiedJedis jedis; protected final boolean isString; - - - RedisCollection(Jedis jedis, Class clazz, String keyWithNameSpace) { + RedisCollection(UnifiedJedis jedis, Class clazz, String keyWithNameSpace) { this.clazz = clazz; this.keyWithNameSpace = keyWithNameSpace; this.jedis = jedis; diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfiguration.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfiguration.java index 584fa0479..3189e4f01 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfiguration.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfiguration.java @@ -15,33 +15,38 @@ package org.eclipse.jnosql.databases.redis.communication; - import org.eclipse.jnosql.communication.Configurations; import org.eclipse.jnosql.communication.Settings; import org.eclipse.jnosql.communication.SettingsBuilder; import org.eclipse.jnosql.communication.keyvalue.KeyValueConfiguration; -import redis.clients.jedis.JedisPool; -import redis.clients.jedis.JedisPoolConfig; - +import redis.clients.jedis.ClientSetInfoConfig; +import redis.clients.jedis.ConnectionPoolConfig; +import redis.clients.jedis.DefaultJedisClientConfig; +import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.JedisClientConfig; +import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.JedisPooled; +import redis.clients.jedis.JedisSentineled; +import redis.clients.jedis.RedisProtocol; +import redis.clients.jedis.UnifiedJedis; + +import java.time.Duration; import java.util.Map; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import static java.util.Arrays.asList; /** * The redis implementation of {@link KeyValueConfiguration} whose returns {@link RedisBucketManagerFactory}. + * * @see RedisConfigurations */ public final class RedisConfiguration implements KeyValueConfiguration { private static final int DEFAULT_PORT = 6379; - private static final int DEFAULT_TIMEOUT = 2000; - private static final int DEFAULT_DATABASE = 0; private static final String DEFAULT_HOST = "localhost"; - private static final int DEFAULT_MAX_TOTAL = 1000; - private static final int DEFAULT_MAX_IDLE = 10; - private static final int DEFAULT_MIN_IDLE = 1; - private static final int DEFAULT_MAX_WAIT_MILLIS = 3000; /** * Creates a {@link RedisConfiguration} from map configuration @@ -56,67 +61,177 @@ public RedisBucketManagerFactory getManagerFactory(Map configura return apply(builder.build()); } - /** - * Creates a {@link RedisBucketManagerFactory} instance from a {@link JedisPool} - * @param jedisPool the jedis pool - * @return a {@link RedisBucketManagerFactory} instance - */ - public RedisBucketManagerFactory get(JedisPool jedisPool) { - Objects.requireNonNull(jedisPool, "jedisPool is required"); - return new DefaultRedisBucketManagerFactory(jedisPool); - } - @Override public RedisBucketManagerFactory apply(Settings settings) { Objects.requireNonNull(settings, "settings is required"); - JedisPoolConfig poolConfig = getJedisPoolConfig(settings); - JedisPool jedisPool = getJedisPool(settings, poolConfig); - return new DefaultRedisBucketManagerFactory(jedisPool); - } + if (settings.keySet() + .stream() + .anyMatch(s -> s.startsWith(RedisSentinelConfigurations.SENTINEL.get()))) { + return applyForSentinel(settings); + } + + if (settings.keySet() + .stream() + .anyMatch(s -> s.startsWith(RedisClusterConfigurations.CLUSTER.get()))) { + return applyForCluster(settings); + } + + var simpleJedisConfig = getJedisClientConfig( + RedisConfigurations.SingleRedisConfigurationsResolver.INSTANCE, settings); + HostAndPort hostAndPort = getHostAndPort(settings); - private JedisPool getJedisPool(Settings settings, JedisPoolConfig poolConfig) { + ConnectionPoolConfig connectionPoolConfig = getConnectionPoolConfig(settings); - String localhost = settings.getSupplier(asList(RedisConfigurations.HOST, Configurations.HOST)) + UnifiedJedis jedis = new JedisPooled( + connectionPoolConfig, + hostAndPort, + simpleJedisConfig); + + return new DefaultRedisBucketManagerFactory(jedis); + } + + private HostAndPort getHostAndPort(Settings settings) { + String localhost = settings + .getSupplier(asList(RedisConfigurations.HOST, Configurations.HOST)) .map(Object::toString).orElse(DEFAULT_HOST); Integer port = settings.get(RedisConfigurations.PORT) .map(Object::toString).map(Integer::parseInt) .orElse(DEFAULT_PORT); + return new HostAndPort(localhost, port); + } + + private RedisBucketManagerFactory applyForCluster(Settings settings) { + + Set clusterNodes = settings.get(RedisClusterConfigurations.CLUSTER_HOSTS) + .map(Object::toString) + .map(h -> h.split(",")) + .map(h -> asList(h).stream().map(HostAndPort::from).collect(Collectors.toSet())) + .orElseThrow(() -> new IllegalArgumentException("The cluster nodes are required")); + + JedisClientConfig clientConfig = getJedisClientConfig( + RedisClusterConfigurations.ClusterConfigurationsResolver.INSTANCE, settings); + + int maxAttempts = settings.get(RedisClusterConfigurations.CLUSTER_MAX_ATTEMPTS) + .map(Object::toString).map(Integer::parseInt) + .orElse(JedisCluster.DEFAULT_MAX_ATTEMPTS); + + Duration maxTotalRetriesDuration = settings + .get(RedisClusterConfigurations.CLUSTER_MAX_TOTAL_RETRIES_DURATION) + .map(Object::toString).map(Duration::parse) + .orElse(Duration.ofMillis((long) clientConfig.getSocketTimeoutMillis() * maxAttempts)); + + ConnectionPoolConfig poolConfig = getConnectionPoolConfig(settings); + + JedisCluster jedis = new JedisCluster( + clusterNodes, + clientConfig, + maxAttempts, + maxTotalRetriesDuration, + poolConfig); + return new DefaultRedisBucketManagerFactory(jedis); + } + + private RedisBucketManagerFactory applyForSentinel(Settings settings) { + + String masterName = settings.get(RedisSentinelConfigurations.SENTINEL_MASTER_NAME) + .map(Object::toString) + .orElseThrow(() -> new IllegalArgumentException("The sentinel master name is required")); + + Set hostAndPorts = settings.get(RedisSentinelConfigurations.SENTINEL_HOSTS) + .map(Object::toString) + .map(h -> h.split(",")) + .map(h -> asList(h).stream().map(HostAndPort::from).collect(Collectors.toSet())) + .orElseThrow(() -> new IllegalArgumentException("The sentinel hosts are required")); + + ConnectionPoolConfig connectionPoolConfig = getConnectionPoolConfig(settings); + + var masterJedisClientConfig = getJedisClientConfig( + RedisSentinelConfigurations.SentinelMasterConfigurationsResolver.INSTANCE,settings); + + var slaveJedisClientConfig = getJedisClientConfig( + RedisSentinelConfigurations.SentinelMasterConfigurationsResolver.INSTANCE, settings); + + JedisSentineled jedis = new JedisSentineled(masterName, + masterJedisClientConfig, + connectionPoolConfig, + hostAndPorts, + slaveJedisClientConfig); + + return new DefaultRedisBucketManagerFactory(jedis); + } - Integer timeout = settings.get(RedisConfigurations.TIMEOUT) + private JedisClientConfig getJedisClientConfig(RedisConfigurationsResolver resolver, Settings settings) { + + DefaultJedisClientConfig.Builder builder = DefaultJedisClientConfig.builder(); + + settings.get(resolver.connectionTimeoutSupplier()) .map(Object::toString).map(Integer::parseInt) - .orElse(DEFAULT_TIMEOUT); + .ifPresent(builder::connectionTimeoutMillis); - String password = settings.getSupplier(asList(RedisConfigurations.PASSWORD, Configurations.PASSWORD)) - .map(Object::toString).orElse(null); - Integer database = settings.get(RedisConfigurations.DATABASE) + settings.get(resolver.socketTimeoutSupplier()) .map(Object::toString).map(Integer::parseInt) - .orElse(DEFAULT_DATABASE); + .ifPresent(builder::socketTimeoutMillis); + + settings.get(resolver.clientNameSupplier()) + .map(Object::toString) + .ifPresent(builder::clientName); + + settings.get(resolver.userSupplier()) + .map(Object::toString) + .ifPresent(builder::user); + + settings.get(resolver.passwordSupplier()) + .map(Object::toString) + .ifPresent(builder::password); - String clientName = settings.get(RedisConfigurations.CLIENT_NAME) - .map(Object::toString).orElse(null); - return new JedisPool(poolConfig, localhost, port, timeout, password, database, clientName); + settings.get(resolver.timeoutSupplier()) + .map(Object::toString).map(Integer::parseInt) + .ifPresent(builder::timeoutMillis); + + settings.get(resolver.sslSupplier()) + .map(Object::toString).map(Boolean::parseBoolean) + .ifPresent(builder::ssl); + + settings.get(resolver.redisProtocolSupplier()) + .map(Object::toString).map(RedisProtocol::valueOf) + .ifPresent(builder::protocol); + + settings.get(resolver.clientsetInfoConfigLibNameSuffixSupplier()) + .map(Object::toString) + .ifPresentOrElse( + libNameSuffix -> builder.clientSetInfoConfig(new ClientSetInfoConfig(libNameSuffix)), + () -> settings.get(resolver.clientsetInfoConfigDisabled()) + .map(Object::toString) + .map(Boolean::parseBoolean) + .map(disabled -> disabled ? ClientSetInfoConfig.DISABLED : ClientSetInfoConfig.DEFAULT) + .ifPresent(builder::clientSetInfoConfig)); + + return builder.build(); } - private JedisPoolConfig getJedisPoolConfig(Settings settings) { - JedisPoolConfig poolConfig = new JedisPoolConfig(); + private ConnectionPoolConfig getConnectionPoolConfig(Settings settings) { + ConnectionPoolConfig poolConfig = new ConnectionPoolConfig(); - poolConfig.setMaxTotal(settings.get(RedisConfigurations.MAX_TOTAL) + settings.get(RedisConfigurations.MAX_TOTAL) .map(Object::toString).map(Integer::parseInt) - .orElse(DEFAULT_MAX_TOTAL)); + .ifPresent(poolConfig::setMaxTotal); - poolConfig.setMaxIdle(settings.get(RedisConfigurations.MAX_IDLE) - .map(Object::toString).map(Integer::parseInt).orElse(DEFAULT_MAX_IDLE)); + settings.get(RedisConfigurations.MAX_IDLE) + .map(Object::toString).map(Integer::parseInt) + .ifPresent(poolConfig::setMaxIdle); - poolConfig.setMinIdle( settings.get(RedisConfigurations.MIN_IDLE) - .map(Object::toString).map(Integer::parseInt).orElse(DEFAULT_MIN_IDLE)); + settings.get(RedisConfigurations.MIN_IDLE) + .map(Object::toString).map(Integer::parseInt) + .ifPresent(poolConfig::setMinIdle); - poolConfig.setMaxWaitMillis(settings.get(RedisConfigurations.MAX_WAIT_MILLIS) + settings.get(RedisConfigurations.MAX_WAIT_MILLIS) .map(Object::toString).map(Integer::parseInt) - .orElse(DEFAULT_MAX_WAIT_MILLIS)); + .ifPresent(poolConfig::setMaxWaitMillis); + return poolConfig; } diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfigurations.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfigurations.java index 52e7e34ff..12bc7d3d1 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfigurations.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfigurations.java @@ -15,7 +15,6 @@ package org.eclipse.jnosql.databases.redis.communication; - import java.util.function.Supplier; /** @@ -36,7 +35,7 @@ public enum RedisConfigurations implements Supplier { */ PORT("jnosql.redis.port"), /** - * The redis timeout, the default value 2000 on milliseconds + * The redis timeout, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} on milliseconds */ TIMEOUT("jnosql.redis.timeout"), /** @@ -44,33 +43,73 @@ public enum RedisConfigurations implements Supplier { */ PASSWORD("jnosql.redis.password"), /** - * The redis database number, the default value is 0 + * The redis database number */ DATABASE("jnosql.redis.database"), /** - * The client's name + * The cluster client's name. The default value is 0. */ CLIENT_NAME("jnosql.redis.client.name"), /** * The value for the maxTotal configuration attribute for pools created with this configuration instance. - * The max number of thread to {@link redis.clients.jedis.JedisPoolConfig}, the default value 1000 + * The default value is {@link org.apache.commons.pool2.impl.GenericObjectPoolConfig#DEFAULT_MAX_TOTAL} */ MAX_TOTAL("jnosql.redis.max.total"), /** * The value for the maxIdle configuration attribute for pools created with this configuration instance. - * The max idle {@link redis.clients.jedis.JedisPoolConfig}, the default value 10 + * The default value is {@link org.apache.commons.pool2.impl.GenericObjectPoolConfig#DEFAULT_MAX_IDLE} */ MAX_IDLE("jnosql.redis.max.idle"), /** * The value for the minIdle configuration attribute for pools created with this configuration instance. - * The min idle {@link redis.clients.jedis.JedisPoolConfig}, the default value 1 + * The default value is {@link org.apache.commons.pool2.impl.GenericObjectPoolConfig#DEFAULT_MIN_IDLE} */ MIN_IDLE("jnosql.redis.min.idle"), /** * The value for the {@code maxWait} configuration attribute for pools created with this configuration instance. - * The max wait on millis on {@link redis.clients.jedis.JedisPoolConfig}, the default value 3000 + * The default value is {@link org.apache.commons.pool2.impl.GenericObjectPoolConfig#DEFAULT_MAX_WAIT_MILLIS} + */ + MAX_WAIT_MILLIS("jnosql.redis.max.wait.millis"), + /** + * The value for the connection timeout in milliseconds configuration attribute for the jedis client configuration + * created with this configuration instance. + * The connection timeout on millis on {@link redis.clients.jedis.JedisClientConfig}, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} + */ + CONNECTION_TIMEOUT("jnosql.redis.connection.timeout"), + /** + * The value for the socket timeout in milliseconds configuration attribute for the jedis client configuration with + * this configuration instance. + * The socket timeout on millis on {@link redis.clients.jedis.JedisClientConfig}, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} + */ + SOCKET_TIMEOUT("jnosql.redis.socket.timeout"), + /** + * The value for the user configuration attribute for the jedis client configuration with this configuration instance. + * The user on {@link redis.clients.jedis.JedisClientConfig} + */ + USER("jnosql.redis.user"), + /** + * The value for the ssl configuration attribute for the jedis client configuration with this configuration instance. + * The ssl on {@link redis.clients.jedis.JedisClientConfig}. The default value is false. + */ + SSL("jnosql.redis.ssl"), + /** + * The value for the protocol configuration attribute for the jedis client configuration with this configuration instance. + * The protocol on {@link redis.clients.jedis.JedisClientConfig}. + * The default value is not defined. + */ + REDIS_PROTOCOL("jnosql.redis.protocol"), + /** + * The value for the clientset info disabled configuration attribute for the jedis client configuration with this configuration instance. + * The clientset info disabled on {@link redis.clients.jedis.JedisClientConfig}. + * The default value is false. + */ + CLIENTSET_INFO_CONFIG_DISABLED("jnosql.redis.clientset.info.config.disabled"), + /** + * The value for the clientset info configuration libname suffix attribute for the jedis client configuration with this configuration instance. + * The clientset info libname suffix on {@link redis.clients.jedis.JedisClientConfig}. + * The default value is not defined. */ - MAX_WAIT_MILLIS("jnosql.redis.max.wait.millis"); + CLIENTSET_INFO_CONFIG_LIBNAME_SUFFIX("jnosql.redis.clientset.info.config.libname.suffix"),; private final String configuration; @@ -82,4 +121,60 @@ public enum RedisConfigurations implements Supplier { public String get() { return configuration; } + + public static enum SingleRedisConfigurationsResolver + implements RedisConfigurationsResolver { + + INSTANCE; + + @Override + public Supplier connectionTimeoutSupplier() { + return RedisConfigurations.CONNECTION_TIMEOUT; + } + + @Override + public Supplier socketTimeoutSupplier() { + return RedisConfigurations.SOCKET_TIMEOUT; + } + + @Override + public Supplier clientNameSupplier() { + return RedisConfigurations.CLIENT_NAME; + } + + @Override + public Supplier userSupplier() { + return RedisConfigurations.USER; + } + + @Override + public Supplier passwordSupplier() { + return RedisConfigurations.PASSWORD; + } + + @Override + public Supplier timeoutSupplier() { + return RedisConfigurations.TIMEOUT; + } + + @Override + public Supplier sslSupplier() { + return RedisConfigurations.SSL; + } + + @Override + public Supplier redisProtocolSupplier() { + return RedisConfigurations.REDIS_PROTOCOL; + } + + @Override + public Supplier clientsetInfoConfigLibNameSuffixSupplier() { + return RedisConfigurations.CLIENTSET_INFO_CONFIG_LIBNAME_SUFFIX; + } + + @Override + public Supplier clientsetInfoConfigDisabled() { + return RedisConfigurations.CLIENTSET_INFO_CONFIG_DISABLED; + } + } } diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfigurationsResolver.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfigurationsResolver.java new file mode 100644 index 000000000..d247990f9 --- /dev/null +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisConfigurationsResolver.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Maximillian Arruda + */ + +package org.eclipse.jnosql.databases.redis.communication; + +import java.util.function.Supplier; + +public sealed interface RedisConfigurationsResolver permits + RedisConfigurations.SingleRedisConfigurationsResolver, + RedisClusterConfigurations.ClusterConfigurationsResolver, + RedisSentinelConfigurations.SentinelMasterConfigurationsResolver, + RedisSentinelConfigurations.SentinelSlaveConfigurationsResolver { + + Supplier connectionTimeoutSupplier(); + + Supplier socketTimeoutSupplier(); + + Supplier clientNameSupplier(); + + Supplier userSupplier(); + + Supplier passwordSupplier(); + + Supplier timeoutSupplier(); + + Supplier sslSupplier(); + + Supplier redisProtocolSupplier(); + + Supplier clientsetInfoConfigLibNameSuffixSupplier(); + + Supplier clientsetInfoConfigDisabled(); +} \ No newline at end of file diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisList.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisList.java index 034df4b15..0e3831055 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisList.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisList.java @@ -15,7 +15,7 @@ package org.eclipse.jnosql.databases.redis.communication; -import redis.clients.jedis.Jedis; +import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.args.ListPosition; import java.util.ArrayList; @@ -28,7 +28,7 @@ class RedisList extends RedisCollection implements List { - RedisList(Jedis jedis, Class clazz, String keyWithNameSpace) { + RedisList(UnifiedJedis jedis, Class clazz, String keyWithNameSpace) { super(jedis, clazz, keyWithNameSpace); } diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisMap.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisMap.java index b71db5b14..51e1ec823 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisMap.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisMap.java @@ -17,7 +17,7 @@ import jakarta.json.bind.Jsonb; import org.eclipse.jnosql.communication.driver.JsonbSupplier; -import redis.clients.jedis.Jedis; +import redis.clients.jedis.UnifiedJedis; import java.util.Collection; import java.util.HashMap; @@ -40,14 +40,13 @@ class RedisMap implements Map { private final String nameSpace; - private final Jedis jedis; + private final UnifiedJedis jedis; private final boolean isKeyString; private final boolean isValueString; - - RedisMap(Jedis jedis, Class keyValue, Class valueClass, String keyWithNameSpace) { + RedisMap(UnifiedJedis jedis, Class keyValue, Class valueClass, String keyWithNameSpace) { this.keyClass = keyValue; this.valueClass = valueClass; this.nameSpace = keyWithNameSpace; diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisQueue.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisQueue.java index 44c4554e5..e031cf056 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisQueue.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisQueue.java @@ -15,7 +15,7 @@ package org.eclipse.jnosql.databases.redis.communication; -import redis.clients.jedis.Jedis; +import redis.clients.jedis.UnifiedJedis; import java.util.NoSuchElementException; import java.util.Objects; @@ -23,7 +23,7 @@ class RedisQueue extends RedisCollection implements Queue { - RedisQueue(Jedis jedis, Class clazz, String keyWithNameSpace) { + RedisQueue(UnifiedJedis jedis, Class clazz, String keyWithNameSpace) { super(jedis, clazz, keyWithNameSpace); } diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisSentinelConfigurations.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisSentinelConfigurations.java new file mode 100644 index 000000000..b732282d0 --- /dev/null +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisSentinelConfigurations.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Maximillian Arruda + */ + +package org.eclipse.jnosql.databases.redis.communication; + +import java.util.function.Supplier; + +/** + * An enumeration to show the available options to connect to the Redis database by Sentinel configuration . + * It implements {@link Supplier}, where its it returns the property name that might be + * overwritten by the system environment using Eclipse Microprofile or Jakarta Config API. + * + * @see org.eclipse.jnosql.communication.Settings + */ +public enum RedisSentinelConfigurations implements Supplier { + /** + * The key property that defines if the redis sentinel configuration should be loaded + * */ + SENTINEL("jnosql.redis.sentinel"), + /** + * The value for the master name configuration attribute for the jedis client configuration with this configuration instance. + */ + SENTINEL_MASTER_NAME("jnosql.redis.sentinel.master.name"), + /** + * The value for the sentinel HOST:PORT (separated by comma) configuration attribute for the jedis client configuration with this configuration instance. + */ + SENTINEL_HOSTS("jnosql.redis.sentinel.hosts"), + /** + * The master client's name, the default value is 0 + */ + MASTER_CLIENT_NAME("jnosql.redis.sentinel.master.client.name"), + /** + * The slave client's name, the default value is 0 + */ + SLAVE_CLIENT_NAME("jnosql.redis.sentinel.slave.client.name"), + /** + * The master redis timeout, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} on milliseconds + */ + MASTER_TIMEOUT("jnosql.redis.sentinel.master.timeout"), + /** + * The slave redis timeout, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} on milliseconds + */ + SLAVE_TIMEOUT("jnosql.redis.sentinel.slave.timeout"), + /** + * The value for the connection timeout in milliseconds configuration attribute for the master jedis client configuration + * created with this configuration instance. + * The connection timeout on millis on {@link redis.clients.jedis.JedisClientConfig}, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} + */ + MASTER_CONNECTION_TIMEOUT("jnosql.redis.sentinel.master.connection.timeout"), + /** + * The value for the connection timeout in milliseconds configuration attribute for the slave jedis client configuration + * created with this configuration instance. + * The connection timeout on millis on {@link redis.clients.jedis.JedisClientConfig}, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} + */ + SLAVE_CONNECTION_TIMEOUT("jnosql.redis.sentinel.slave.connection.timeout"), + /** + * The value for the socket timeout in milliseconds configuration attribute for the master jedis client configuration with + * this configuration instance. + * The socket timeout on millis on {@link redis.clients.jedis.JedisClientConfig}, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} + */ + MASTER_SOCKET_TIMEOUT("jnosql.redis.sentinel.master.socket.timeout"), + /** + * The value for the socket timeout in milliseconds configuration attribute for the slave jedis client configuration with + * this configuration instance. + * The socket timeout on millis on {@link redis.clients.jedis.JedisClientConfig}, the default value is {@link redis.clients.jedis.Protocol#DEFAULT_TIMEOUT} + */ + SLAVE_SOCKET_TIMEOUT("jnosql.redis.sentinel.slave.socket.timeout"), + /** + * The value for the user configuration attribute for the master jedis client configuration with this configuration instance. + * The user on {@link redis.clients.jedis.JedisClientConfig} + */ + MASTER_USER("jnosql.redis.sentinel.master.user"), + /** + * The value for the user configuration attribute for the slave jedis client configuration with this configuration instance. + * The user on {@link redis.clients.jedis.JedisClientConfig} + */ + SLAVE_USER("jnosql.redis.sentinel.slave.user"), + /** + * The value for the password configuration attribute for the master jedis client configuration with this configuration instance. + * The user on {@link redis.clients.jedis.JedisClientConfig} + */ + MASTER_PASSWORD("jnosql.redis.sentinel.master.password"), + /** + * The value for the password configuration attribute for the slave jedis client configuration with this configuration instance. + * The user on {@link redis.clients.jedis.JedisClientConfig} + */ + SLAVE_PASSWORD("jnosql.redis.sentinel.slave.password"), + /** + * The value for the ssl configuration attribute for the master jedis client configuration with this configuration instance. + * The ssl on {@link redis.clients.jedis.JedisClientConfig}. The default value is false. + */ + MASTER_SSL("jnosql.redis.sentinel.master.ssl"), + /** + * The value for the ssl configuration attribute for the slave jedis client configuration with this configuration instance. + * The ssl on {@link redis.clients.jedis.JedisClientConfig}. The default value is false + */ + SLAVE_SSL("jnosql.redis.sentinel.slave.ssl"), + /** + * The value for the protocol configuration attribute for the master jedis client configuration with this configuration instance. + * The protocol on {@link redis.clients.jedis.JedisClientConfig} + */ + MASTER_REDIS_PROTOCOL("jnosql.redis.sentinel.master.protocol"), + /** + * The value for the protocol configuration attribute for the slave jedis client configuration with this configuration instance. + * The protocol on {@link redis.clients.jedis.JedisClientConfig} + */ + SLAVE_REDIS_PROTOCOL("jnosql.redis.sentinel.slave.protocol"), + /** + * The value for the clientset info disabled configuration attribute for the master jedis client configuration with this configuration instance. + * The clientset info disabled on {@link redis.clients.jedis.JedisClientConfig} + */ + MASTER_CLIENTSET_INFO_CONFIG_DISABLED("jnosql.redis.sentinel.master.clientset.info.config.disabled"), + /** + * The value for the clientset info disabled configuration attribute for the slave jedis client configuration with this configuration instance. + * The clientset info disabled on {@link redis.clients.jedis.JedisClientConfig} + */ + SLAVE_CLIENTSET_INFO_CONFIG_DISABLED("jnosql.redis.sentinel.slave.clientset.info.config.disabled"), + /** + * The value for the clientset info configuration libname suffix attribute for the master jedis client configuration with this configuration instance. + * The clientset info libname suffix on {@link redis.clients.jedis.JedisClientConfig} + */ + MASTER_CLIENTSET_INFO_CONFIG_LIBNAME_SUFFIX("jnosql.redis.sentinel.master.clientset.info.config.libname.suffix"), + /** + * The value for the clientset info configuration libname suffix attribute for the slave jedis client configuration with this configuration instance. + * The clientset info libname suffix on {@link redis.clients.jedis.JedisClientConfig} + */ + SLAVE_CLIENTSET_INFO_CONFIG_LIBNAME_SUFFIX("jnosql.redis.sentinel.slave.clientset.info.config.libname.suffix"); + + private final String configuration; + + RedisSentinelConfigurations(String configuration) { + this.configuration = configuration; + } + + @Override + public String get() { + return configuration; + } + + public static enum SentinelMasterConfigurationsResolver implements RedisConfigurationsResolver { + + INSTANCE; + + @Override + public Supplier connectionTimeoutSupplier() { + return RedisSentinelConfigurations.MASTER_CONNECTION_TIMEOUT; + } + + @Override + public Supplier socketTimeoutSupplier() { + return RedisSentinelConfigurations.MASTER_SOCKET_TIMEOUT; + } + + @Override + public Supplier clientNameSupplier() { + return RedisSentinelConfigurations.MASTER_CLIENT_NAME; + } + + @Override + public Supplier userSupplier() { + return RedisSentinelConfigurations.MASTER_USER; + } + + @Override + public Supplier passwordSupplier() { + return RedisSentinelConfigurations.MASTER_PASSWORD; + } + + @Override + public Supplier timeoutSupplier() { + return RedisSentinelConfigurations.MASTER_TIMEOUT; + } + + @Override + public Supplier sslSupplier() { + return RedisSentinelConfigurations.MASTER_SSL; + } + + @Override + public Supplier redisProtocolSupplier() { + return RedisSentinelConfigurations.MASTER_REDIS_PROTOCOL; + } + + @Override + public Supplier clientsetInfoConfigLibNameSuffixSupplier() { + return RedisSentinelConfigurations.MASTER_CLIENTSET_INFO_CONFIG_LIBNAME_SUFFIX; + } + + @Override + public Supplier clientsetInfoConfigDisabled() { + return RedisSentinelConfigurations.MASTER_CLIENTSET_INFO_CONFIG_DISABLED; + } + } + + public static enum SentinelSlaveConfigurationsResolver implements RedisConfigurationsResolver { + + INSTANCE; + + @Override + public Supplier connectionTimeoutSupplier() { + return RedisSentinelConfigurations.SLAVE_CONNECTION_TIMEOUT; + } + + @Override + public Supplier socketTimeoutSupplier() { + return RedisSentinelConfigurations.SLAVE_SOCKET_TIMEOUT; + } + + @Override + public Supplier clientNameSupplier() { + return RedisSentinelConfigurations.SLAVE_CLIENT_NAME; + } + + @Override + public Supplier userSupplier() { + return RedisSentinelConfigurations.SLAVE_USER; + } + + @Override + public Supplier passwordSupplier() { + return RedisSentinelConfigurations.SLAVE_PASSWORD; + } + + @Override + public Supplier timeoutSupplier() { + return RedisSentinelConfigurations.SLAVE_TIMEOUT; + } + + @Override + public Supplier sslSupplier() { + return RedisSentinelConfigurations.SLAVE_SSL; + } + + @Override + public Supplier redisProtocolSupplier() { + return RedisSentinelConfigurations.SLAVE_REDIS_PROTOCOL; + } + + @Override + public Supplier clientsetInfoConfigLibNameSuffixSupplier() { + return RedisSentinelConfigurations.SLAVE_CLIENTSET_INFO_CONFIG_LIBNAME_SUFFIX; + } + + @Override + public Supplier clientsetInfoConfigDisabled() { + return RedisSentinelConfigurations.SLAVE_CLIENTSET_INFO_CONFIG_DISABLED; + } + } +} \ No newline at end of file diff --git a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisSet.java b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisSet.java index 8123c0d94..51bd12b62 100644 --- a/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisSet.java +++ b/jnosql-redis/src/main/java/org/eclipse/jnosql/databases/redis/communication/RedisSet.java @@ -15,7 +15,7 @@ package org.eclipse.jnosql.databases.redis.communication; -import redis.clients.jedis.Jedis; +import redis.clients.jedis.UnifiedJedis; import java.util.ArrayList; import java.util.List; @@ -24,7 +24,7 @@ class RedisSet extends RedisCollection implements Set { - RedisSet(Jedis jedis, Class clazz, String keyWithNameSpace) { + RedisSet(UnifiedJedis jedis, Class clazz, String keyWithNameSpace) { super(jedis, clazz, keyWithNameSpace); }