redis cluster客戶端有兩種;
Dummy:又稱爲傀儡客戶端,redis的重定向機制會返回當前鍵所在的槽和對應的節點,dummy客戶端根據這一機制隨機連接任一redis獲取鍵所在的節點,這種客戶端實現代碼簡單,每次只需要根據重定向的信息再次發送請求即可,但是這樣弊端也和明顯,根據重定向再次發送請求額外增加了開銷。
smart:它會在內部維護一個slot→node的映射關係,本地就可以實現鍵到節點的查找,從而保證IO效率的莪最大化。
jedisCluster就是一種smart客戶端,它的構造方法如下:
public JedisCluster(Set<HostAndPort> jedisClusterNode, int connectionTimeout, int soTimeout,
int maxAttempts, String password, final GenericObjectPoolConfig poolConfig) {
super(jedisClusterNode, connectionTimeout, soTimeout, maxAttempts, password, poolConfig);
}
參數說明:
Set jedisClusterNode:所有redis cluster節點信息,也可以只填寫部分,應爲客戶端可以通過cluster slots發現
int connectionTimeout:連接超時
soTimeout:讀寫超時
maxAttempts:重試次數,JedisCluster在連接的時候,如果出現連接錯誤,則會嘗試隨機連接一個節點,如果當期嘗試的節點返回Moved重定向,jedis cluster會重新更新clots緩存。如果重試依然返回連接錯誤,會接着再次重試,當重試次數大於maxAttempts會報出Jedis ClusterMaxRedirectionsException(“to many Cluster redireciotns?”)異常
password:集羣密碼
poolConfig:連接池參數
JedisCluster有以下特點、
1)它會爲所有節點都維護一個連接池JedisPool,建議JedisCluster使用單例
2)JedisCluster每次操作完不需要管理連接池的借還,它在內部已經完成
3)JedisCluster一般不需要執行close操作,它會將所有的JedisPool執行destroy操作
pom依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.0</version>
</dependency>
JedisCluster實例
package com.gildata.duplicateandtagtest.redis;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.util.HashSet;
import java.util.Set;
/**
* Created by LiChao on 2019/2/16
*/
public class RedisClusterUtil {
private static JedisCluster jedis = null;
//可用連接實例的最大數目,默認爲8;
//如果賦值爲-1,則表示不限制,如果pool已經分配了maxActive個jedis實例,則此時pool的狀態爲exhausted(耗盡)
private static Integer MAX_TOTAL = 1024;
//控制一個pool最多有多少個狀態爲idle(空閒)的jedis實例,默認值是8
private static Integer MAX_IDLE = 200;
//等待可用連接的最大時間,單位是毫秒,默認值爲-1,表示永不超時。
//如果超過等待時間,則直接拋出JedisConnectionException
private static Integer MAX_WAIT_MILLIS = 10000;
//在borrow(用)一個jedis實例時,是否提前進行validate(驗證)操作;
//如果爲true,則得到的jedis實例均是可用的
private static Boolean TEST_ON_BORROW = true;
//在空閒時檢查有效性, 默認false
private static Boolean TEST_WHILE_IDLE = true;
//是否進行有效性檢查
private static Boolean TEST_ON_RETURN = true;
//訪問密碼
private static String AUTH = "1234@abcd";
/**
* 靜態塊,初始化Redis連接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
/*注意:
在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig沒有setMaxActive和setMaxWait屬性了
這是因爲高版本中官方廢棄了此方法,用以下兩個屬性替換。
maxActive ==> maxTotal
maxWait==> maxWaitMillis
*/
config.setMaxTotal(MAX_TOTAL);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT_MILLIS);
config.setTestOnBorrow(TEST_ON_BORROW);
config.setTestWhileIdle(TEST_WHILE_IDLE);
config.setTestOnReturn(TEST_ON_RETURN);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("192.168.0.31", 6380));
jedisClusterNode.add(new HostAndPort("192.168.0.32", 6380));
jedisClusterNode.add(new HostAndPort("192.168.0.33", 6380));
jedisClusterNode.add(new HostAndPort("192.168.0.34", 6380));
jedisClusterNode.add(new HostAndPort("192.168.0.35", 6380));
jedisClusterNode.add(new HostAndPort("192.168.0.36", 6380));
jedis = new JedisCluster(jedisClusterNode,1000,1000,5,AUTH,config);
} catch (Exception e) {
e.printStackTrace();
}
}
public static JedisCluster getJedis(){
return jedis;
}
}
測試
@Test
public void testCluster(){
JedisCluster jedis = RedisClusterUtil.getJedis();
jedis.set("cluster","hello world");
System.out.println(jedis.get("cluster"));
}