Skip to content

Commit 8fe48a7

Browse files
committed
Add new classes
1 parent c82a155 commit 8fe48a7

File tree

3 files changed

+284
-0
lines changed

3 files changed

+284
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package redis.clients.jedis;
2+
3+
import java.net.URI;
4+
5+
import redis.clients.jedis.builders.StandaloneClientBuilder;
6+
import redis.clients.jedis.csc.Cache;
7+
import redis.clients.jedis.executors.CommandExecutor;
8+
import redis.clients.jedis.providers.ConnectionProvider;
9+
import redis.clients.jedis.providers.PooledConnectionProvider;
10+
import redis.clients.jedis.util.JedisURIHelper;
11+
import redis.clients.jedis.util.Pool;
12+
13+
public class RedisClient extends UnifiedJedis {
14+
15+
public RedisClient() {
16+
this(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT);
17+
}
18+
19+
/**
20+
* WARNING: This constructor only accepts a uri string as {@code url}. {@link JedisURIHelper#isValid(java.net.URI)}
21+
* can be used before this.
22+
* <p>
23+
* To use a host string, {@link #RedisClient(java.lang.String, int)} can be used with {@link Protocol#DEFAULT_PORT}.
24+
*
25+
* @param url
26+
*/
27+
public RedisClient(final String url) {
28+
super(url);
29+
}
30+
31+
public RedisClient(final String host, final int port) {
32+
this(new HostAndPort(host, port));
33+
}
34+
35+
public RedisClient(final HostAndPort hostAndPort) {
36+
super(hostAndPort);
37+
}
38+
39+
public RedisClient(final String host, final int port, final String user, final String password) {
40+
super(new HostAndPort(host, port), DefaultJedisClientConfig.builder().user(user).password(password).build());
41+
}
42+
43+
public RedisClient(final URI uri) {
44+
super(uri);
45+
}
46+
47+
private RedisClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider, CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
48+
super(commandExecutor, connectionProvider, commandObjects, redisProtocol, cache);
49+
}
50+
51+
/**
52+
* Fluent builder for {@link RedisClient} (standalone).
53+
* <p>
54+
* Obtain an instance via {@link #builder()}.
55+
* </p>
56+
*/
57+
static public class Builder extends StandaloneClientBuilder<RedisClient> {
58+
59+
@Override
60+
protected RedisClient createClient() {
61+
return new RedisClient(commandExecutor, connectionProvider, commandObjects, clientConfig.getRedisProtocol(),
62+
cache);
63+
}
64+
}
65+
66+
/**
67+
* Create a new builder for configuring RedisClient instances.
68+
* @return a new {@link RedisClient.Builder} instance
69+
*/
70+
public static Builder builder() {
71+
return new Builder();
72+
}
73+
74+
public final Pool<Connection> getPool() {
75+
return ((PooledConnectionProvider) provider).getPool();
76+
}
77+
78+
@Override
79+
public Pipeline pipelined() {
80+
return (Pipeline) super.pipelined();
81+
}
82+
}
83+
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package redis.clients.jedis;
2+
3+
import java.time.Duration;
4+
import java.util.Collections;
5+
import java.util.Map;
6+
import java.util.Set;
7+
8+
import redis.clients.jedis.builders.ClusterClientBuilder;
9+
import redis.clients.jedis.executors.ClusterCommandExecutor;
10+
import redis.clients.jedis.executors.CommandExecutor;
11+
import redis.clients.jedis.providers.ClusterConnectionProvider;
12+
import redis.clients.jedis.csc.Cache;
13+
import redis.clients.jedis.providers.ConnectionProvider;
14+
import redis.clients.jedis.util.JedisClusterCRC16;
15+
16+
public class RedisClusterClient extends UnifiedJedis {
17+
18+
public static final String INIT_NO_ERROR_PROPERTY = "jedis.cluster.initNoError";
19+
20+
/**
21+
* Default timeout in milliseconds.
22+
*/
23+
public static final int DEFAULT_TIMEOUT = 2000;
24+
25+
/**
26+
* Default amount of attempts for executing a command
27+
*/
28+
public static final int DEFAULT_MAX_ATTEMPTS = 5;
29+
30+
/**
31+
* Creates a RedisClusterClient instance. The provided node is used to make the first contact with the cluster.
32+
* <p>
33+
* Here, the default timeout of {@value redis.clients.jedis.RedisClusterClient#DEFAULT_TIMEOUT} ms is being used with
34+
* {@value redis.clients.jedis.RedisClusterClient#DEFAULT_MAX_ATTEMPTS} maximum attempts.
35+
* @param node Node to first connect to.
36+
*/
37+
public RedisClusterClient(HostAndPort node) {
38+
super(new ClusterConnectionProvider(Collections.singleton(node), DefaultJedisClientConfig.builder().timeoutMillis(DEFAULT_TIMEOUT).build()),
39+
DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
40+
}
41+
42+
/**
43+
* Creates a RedisClusterClient with multiple entry points.
44+
* <p>
45+
* Here, the default timeout of {@value redis.clients.jedis.RedisClusterClient#DEFAULT_TIMEOUT} ms is being used with
46+
* {@value redis.clients.jedis.RedisClusterClient#DEFAULT_MAX_ATTEMPTS} maximum attempts.
47+
* @param nodes Nodes to connect to.
48+
*/
49+
public RedisClusterClient(Set<HostAndPort> nodes) {
50+
super(new ClusterConnectionProvider(nodes, DefaultJedisClientConfig.builder().timeoutMillis(DEFAULT_TIMEOUT).build()),
51+
DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
52+
}
53+
54+
public RedisClusterClient(Set<HostAndPort> nodes, String user, String password) {
55+
super(new ClusterConnectionProvider(nodes, DefaultJedisClientConfig.builder().user(user).password(password).build()),
56+
DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) Protocol.DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
57+
}
58+
59+
private RedisClusterClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider, CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
60+
super(commandExecutor, connectionProvider, commandObjects, redisProtocol, cache);
61+
}
62+
63+
/**
64+
* Fluent builder for {@link RedisClusterClient} (Redis Cluster).
65+
* <p>
66+
* Obtain an instance via {@link #builder()}.
67+
* </p>
68+
*/
69+
static public class Builder extends ClusterClientBuilder<RedisClusterClient> {
70+
71+
@Override
72+
protected RedisClusterClient createClient() {
73+
return new RedisClusterClient(commandExecutor, connectionProvider, commandObjects, clientConfig.getRedisProtocol(),
74+
cache);
75+
}
76+
}
77+
78+
/**
79+
* Create a new builder for configuring RedisClusterClient instances.
80+
* @return a new {@link RedisClusterClient.Builder} instance
81+
*/
82+
public static Builder builder() {
83+
return new Builder();
84+
}
85+
86+
/**
87+
* Returns all nodes that were configured to connect to in key-value pairs ({@link Map}).<br>
88+
* Key is the HOST:PORT and the value is the connection pool.
89+
* @return the map of all connections.
90+
*/
91+
public Map<String, ConnectionPool> getClusterNodes() {
92+
return ((ClusterConnectionProvider) provider).getNodes();
93+
}
94+
95+
/**
96+
* Returns the connection for one of the 16,384 slots.
97+
* @param slot the slot to retrieve the connection for.
98+
* @return connection of the provided slot. {@code close()} of this connection must be called after use.
99+
*/
100+
public Connection getConnectionFromSlot(int slot) {
101+
return ((ClusterConnectionProvider) provider).getConnectionFromSlot(slot);
102+
}
103+
104+
// commands
105+
public long spublish(String channel, String message) {
106+
return executeCommand(commandObjects.spublish(channel, message));
107+
}
108+
109+
public long spublish(byte[] channel, byte[] message) {
110+
return executeCommand(commandObjects.spublish(channel, message));
111+
}
112+
113+
public void ssubscribe(final JedisShardedPubSub jedisPubSub, final String... channels) {
114+
try (Connection connection = getConnectionFromSlot(JedisClusterCRC16.getSlot(channels[0]))) {
115+
jedisPubSub.proceed(connection, channels);
116+
}
117+
}
118+
119+
public void ssubscribe(BinaryJedisShardedPubSub jedisPubSub, final byte[]... channels) {
120+
try (Connection connection = getConnectionFromSlot(JedisClusterCRC16.getSlot(channels[0]))) {
121+
jedisPubSub.proceed(connection, channels);
122+
}
123+
}
124+
// commands
125+
126+
@Override
127+
public ClusterPipeline pipelined() {
128+
return new ClusterPipeline((ClusterConnectionProvider) provider, (ClusterCommandObjects) commandObjects);
129+
}
130+
131+
/**
132+
* @param doMulti param
133+
* @return nothing
134+
* @throws UnsupportedOperationException
135+
*/
136+
@Override
137+
public AbstractTransaction transaction(boolean doMulti) {
138+
throw new UnsupportedOperationException();
139+
}
140+
141+
public final <T> T executeCommandToReplica(CommandObject<T> commandObject) {
142+
if (!(executor instanceof ClusterCommandExecutor)) {
143+
throw new UnsupportedOperationException("Support only execute to replica in ClusterCommandExecutor");
144+
}
145+
return ((ClusterCommandExecutor) executor).executeCommandToReplica(commandObject);
146+
}
147+
}
148+
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package redis.clients.jedis;
2+
3+
import java.util.Set;
4+
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
5+
import redis.clients.jedis.annots.Experimental;
6+
import redis.clients.jedis.builders.SentinelClientBuilder;
7+
import redis.clients.jedis.csc.Cache;
8+
import redis.clients.jedis.csc.CacheConfig;
9+
import redis.clients.jedis.csc.CacheFactory;
10+
import redis.clients.jedis.executors.CommandExecutor;
11+
import redis.clients.jedis.providers.ConnectionProvider;
12+
import redis.clients.jedis.providers.SentineledConnectionProvider;
13+
14+
public class RedisSentinelClient extends UnifiedJedis {
15+
16+
private RedisSentinelClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider, CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
17+
super(commandExecutor, connectionProvider, commandObjects, redisProtocol, cache);
18+
}
19+
20+
/**
21+
* Fluent builder for {@link RedisSentinelClient} (Redis Sentinel).
22+
* <p>
23+
* Obtain an instance via {@link #builder()}.
24+
* </p>
25+
*/
26+
static public class Builder extends SentinelClientBuilder<RedisSentinelClient> {
27+
28+
@Override
29+
protected RedisSentinelClient createClient() {
30+
return new RedisSentinelClient(commandExecutor, connectionProvider, commandObjects, clientConfig.getRedisProtocol(),
31+
cache);
32+
}
33+
}
34+
35+
/**
36+
* Create a new builder for configuring RedisSentinelClient instances.
37+
*
38+
* @return a new {@link RedisSentinelClient.Builder} instance
39+
*/
40+
public static Builder builder() {
41+
return new Builder();
42+
}
43+
44+
public HostAndPort getCurrentMaster() {
45+
return ((SentineledConnectionProvider) provider).getCurrentMaster();
46+
}
47+
48+
@Override
49+
public Pipeline pipelined() {
50+
return (Pipeline) super.pipelined();
51+
}
52+
}
53+

0 commit comments

Comments
 (0)