【集群】JedisCluster 原理


1. JedisCluster類結構

    JedisCluster是針對RedisCluster的java客戶端,它封裝了java訪問redis集群的各種操作,包括初始化連接、請求重定向等。我們先來看下JedisCluster的類結構:

 

 

    JedisCluster初始化時,所有的集群連接信息都是封裝在JedisClusterInfoCache里,由於jedis本身不是線程安全的,所以使用對象池JedisPool來保證線程安全,在JedisClusterInfoCache中,除了要保存節點和槽的一一對應關系,還要為每個節點建立一個對象池JedisPool,並保存在map。這個類主要用於保存集群的配置信息,並且是JedisCluster初始化部分的核心所在。JedisClusterConnectionHandler是cache類的一個窗口,cache類似數據管理層,而Handler就類似於操控數據提供服務的Service層。

2. JedisCluster調用時序

 

 

 

    從上圖可以看出,Jedis建立集群的過程很清晰,傳入節點信息,通過其中一個節點從redis服務器拿到整個集群的信息,包括槽位對應關系,主從節點的信息,將這些信息保存在JedisClusterInfoCache中。

JedisCluster的調用流程

Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>(); jedisClusterNode.add(new HostAndPort("127.0.0.1", 7379)); JedisCluster jc = new JedisCluster(jedisClusterNode, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_REDIRECTIONS, "cluster", DEFAULT_CONFIG); jc.set("foo", "bar"); assertEquals("bar", jc.get("foo")); 
 

 

 
 
 

 

    在發送請求時,JedisCluster對象先從初始化得到的集群map中獲取key對應的節點連接,即一個可用的Jedis對象。然后通過這個對象發送get key 命令。
    通常,根據key計算槽位得到的節點不會報錯。所以如果發生connectionException,或者MovedDataException,說明初始化得到的槽位與節點的對應關系有問題,即與實際的對應關系不符,應當重置map。 如果出現ASK異常,說明數據正在遷移,需要臨時使用返回消息指定的地址,重新發送命令。在這里,Jedis通過異常反饋,智能地同步了客戶端與服務端的集群信息。



轉自:https://www.jianshu.com/p/5ca98b5a336b


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM