Redis 集群获取key 对应的Jedis实例
由于JedisCluster 把连接池进行了封装,把不同的key放到不同slot下,无法直接取出Jedis实例进行直接管理,
但是某些操作需要使用Jedis实例进行操作以提高效率。
此处提供一个简单方案获取Jedis实例
首先创建包:redis.clients.jedis
然后创建一个类继承JedisCluster
MyJedisCluster.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package redis.clients.jedis; import java.util.Set; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.util.JedisClusterCRC16; import redis.clients.util.SafeEncoder; public class MyJedisCluster extends JedisCluster { public MyJedisCluster(Set<HostAndPort> jedisClusterNode, int connectionTimeout, int soTimeout, int maxAttempts, GenericObjectPoolConfig poolConfig) { super(jedisClusterNode, connectionTimeout, soTimeout, maxAttempts, poolConfig); } public MyJedisCluster(Set<HostAndPort> jedisClusterNode, int connectionTimeout, int maxAttempts, GenericObjectPoolConfig poolConfig) { super(jedisClusterNode, connectionTimeout, maxAttempts, poolConfig); } public MyJedisCluster(Set<HostAndPort> jedisClusterNode, int connectionTimeout, int soTimeout, int maxAttempts, String password, GenericObjectPoolConfig poolConfig) { super(jedisClusterNode, connectionTimeout, soTimeout, maxAttempts, password, poolConfig); } public Jedis getJedis(String key) { byte[] keyCode = SafeEncoder.encode(key); Jedis connection = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(keyCode)); return connection; } } |
由于connectionHandler.getConnectionFromSlot 的范围是同一包下可以访问 所以把MyJedisCluster 放到 redis.clients.jedis 下
这样就可以通过指定的key 获取对应的jedis 实例,需要注意的是用完jedis 需要手动调用close方法 把jedis放回连接池