redis實戰第三篇 jedis連接redis cluster

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"));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章