日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Jedis Cluster源码分析

發布時間:2024/6/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jedis Cluster源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一個項目用到Jedis客戶端,需要對這個客戶端進行改造。看了一下Jedis Cluster源碼,做個記錄

首先,說核心內容, 在Jedis源碼中,關于cluster有個兩個重要的map。一個是nodes,一個是slots

nodes: ?host:port ?----> ?JedisPool

slots: ?slot ----> JedisPool

nodes存放的是key為host:port到JedisPool的映射

slots存放的 slot到JedisPool的映射

這里,JedisPool是用apache common pool存放jedis對象的pool,slot是通過Crc16算出對16384取余得到

上個Jedis Cluster的Demo吧

1 import redis.clients.jedis.HostAndPort; 2 import redis.clients.jedis.JedisCluster; 3 import java.util.HashSet; 4 import java.util.Set; 5 6 /** 7 * Created by guanxianseng on 2017/8/15. 8 * 9 * nodes: host:port -> JedisPool 10 * slots: slot -> JedisPool 11 */ 12 public class TestCluster { 13 public static void main(String[] args) { 14 Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>(); 15 jedisClusterNodes.add(new HostAndPort("192.168.211.131", 7340)); 16 jedisClusterNodes.add(new HostAndPort("192.168.211.131", 7341)); 17 jedisClusterNodes.add(new HostAndPort("192.168.211.131", 7342)); 18 JedisCluster jc = new JedisCluster(jedisClusterNodes); 19 jc.set("name", "guanxianseng"); 20 System.out.println(jc.get("name")); 21 } 22 }

輸出

guanxiansengProcess finished with exit code 0

這里IP是我的虛擬機的IP,開了兩臺虛擬機,部署的是三主三從的集群

首先,進入JedisCluster的構造函數,一路找下去,我們會看到這樣的代碼

1 public JedisClusterConnectionHandler(Set<HostAndPort> nodes, 2 final GenericObjectPoolConfig poolConfig, int connectionTimeout, int soTimeout, String password) { 3 this.cache = new JedisClusterInfoCache(poolConfig, connectionTimeout, soTimeout, password); 4 initializeSlotsCache(nodes, poolConfig, password); 5 }

進入initializeSlotsCache方法

1 private void initializeSlotsCache(Set<HostAndPort> startNodes, GenericObjectPoolConfig poolConfig, String password) { 2 for (HostAndPort hostAndPort : startNodes) { 3 Jedis jedis = new Jedis(hostAndPort.getHost(), hostAndPort.getPort()); 4 if (password != null) { 5 jedis.auth(password); 6 } 7 try { 8 cache.discoverClusterNodesAndSlots(jedis); 9 break; 10 } catch (JedisConnectionException e) { 11 // try next nodes 12 } finally { 13 if (jedis != null) { 14 jedis.close(); 15 } 16 } 17 } 18 }

這里,獲取集群節點的jedis對象,進入discoverClusterNodesAndSlots(jedis)

1 public void discoverClusterNodesAndSlots(Jedis jedis) { 2 w.lock(); 3 4 try { 5 reset(); 6 List<Object> slots = jedis.clusterSlots(); 7 8 for (Object slotInfoObj : slots) { 9 List<Object> slotInfo = (List<Object>) slotInfoObj; 10 11 if (slotInfo.size() <= MASTER_NODE_INDEX) { 12 continue; 13 } 14 15 List<Integer> slotNums = getAssignedSlotArray(slotInfo); 16 17 // hostInfos 18 int size = slotInfo.size(); 19 for (int i = MASTER_NODE_INDEX; i < size; i++) { 20 List<Object> hostInfos = (List<Object>) slotInfo.get(i); 21 if (hostInfos.size() <= 0) { 22 continue; 23 } 24 25 HostAndPort targetNode = generateHostAndPort(hostInfos); 26 setupNodeIfNotExist(targetNode); 27 if (i == MASTER_NODE_INDEX) { 28 assignSlotsToNode(slotNums, targetNode); 29 } 30 } 31 } 32 } finally { 33 w.unlock(); 34 } 35 }

第6行,其實就是執行slots命令。進入getAssignedSlotArray方法

private List<Integer> getAssignedSlotArray(List<Object> slotInfo) {List<Integer> slotNums = new ArrayList<Integer>();for (int slot = ((Long) slotInfo.get(0)).intValue(); slot <= ((Long) slotInfo.get(1)).intValue(); slot++) {slotNums.add(slot);}return slotNums;}

這里獲取了,節點分配的slots

回到上面,進入generateHostAndPort方法

private HostAndPort generateHostAndPort(List<Object> hostInfos) {return new HostAndPort(SafeEncoder.encode((byte[]) hostInfos.get(0)),((Long) hostInfos.get(1)).intValue());}

這里獲取到節點的host和port

回到上面,進入setupNodeIfNotExist(targetNode);

1 public JedisPool setupNodeIfNotExist(HostAndPort node) { 2 w.lock(); 3 try { 4 String nodeKey = getNodeKey(node); 5 JedisPool existingPool = nodes.get(nodeKey); 6 if (existingPool != null) return existingPool; 7 8 JedisPool nodePool = new JedisPool(poolConfig, node.getHost(), node.getPort(), 9 connectionTimeout, soTimeout, password, 0, null, false, null, null, null); 10 nodes.put(nodeKey, nodePool); 11 return nodePool; 12 } finally { 13 w.unlock(); 14 } 15 }

這里設置我們一開始提到的nodes, host:port ? -------> JedisPool映射

繼續回到上面,進入assignSlotsToNode(slotNums, targetNode);

1 public void assignSlotsToNode(List<Integer> targetSlots, HostAndPort targetNode) { 2 w.lock(); 3 try { 4 JedisPool targetPool = setupNodeIfNotExist(targetNode); 5 for (Integer slot : targetSlots) { 6 slots.put(slot, targetPool); 7 } 8 } finally { 9 w.unlock(); 10 } 11 }

這里設置了前面說的slots, slot ------> JedisPool的映射

這里初始化完成

執行set命令

1 @Override 2 public String set(final String key, final String value) { 3 return new JedisClusterCommand<String>(connectionHandler, maxAttempts) { 4 @Override 5 public String execute(Jedis connection) { 6 return connection.set(key, value); 7 } 8 }.run(key); 9 }

進入run(key);方法

1 public T run(String key) { 2 if (key == null) { 3 throw new JedisClusterException("No way to dispatch this command to Redis Cluster."); 4 } 5 6 return runWithRetries(SafeEncoder.encode(key), this.maxAttempts, false, false); 7 }

進入runWithRetries()

1 private T runWithRetries(byte[] key, int attempts, boolean tryRandomNode, boolean asking) { 2 if (attempts <= 0) { 3 throw new JedisClusterMaxRedirectionsException("Too many Cluster redirections?"); 4 } 5 6 Jedis connection = null; 7 try { 8 9 if (asking) { 10 // TODO: Pipeline asking with the original command to make it 11 // faster.... 12 connection = askConnection.get(); 13 connection.asking(); 14 15 // if asking success, reset asking flag 16 asking = false; 17 } else { 18 if (tryRandomNode) { 19 connection = connectionHandler.getConnection(); 20 } else { 21 connection = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(key)); 22 } 23 } 24 25 return execute(connection); 26 27 } catch (JedisNoReachableClusterNodeException jnrcne) {

這里有點長,截取了前面一部分

1 connection = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(key));

這里,計算key的slot,從slots獲取Jedis對象

到這,基本已完成

?

總結一下,執行slots命令,緩存host:port --> JedisPool, slot ---->JedisPool映射。執行命令,key ---> slot ----> JedisPool ? ------->Jedis

?

?

轉載于:https://www.cnblogs.com/luckygxf/p/7368493.html

總結

以上是生活随笔為你收集整理的Jedis Cluster源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品一区欧美 | 青青草原成人网 | 国产91精品一区二区麻豆亚洲 | jzjzjz欧美丰满少妇 | 亚洲五月婷 | 亚洲av成人一区二区国产精品 | 亚洲欧美日韩一区二区三区四区 | 在线免费看91 | 午夜成人亚洲理伦片在线观看 | 中国老头性行为xxxx | 国产二区三区 | 亚洲一区日本 | 在线观看国产免费视频 | 粉嫩av.com| 精品国产av色一区二区深夜久久 | 久久av影视 | 国产在线一二三区 | 毛片视屏| 天天做天天爱天天操 | 国产精品久久久久久亚洲毛片 | 亚洲精品乱码久久久久久黑人 | 久久久久久久九九九九 | 无码一区二区三区免费 | 日韩精品一区二区三区中文字幕 | 超碰.com| xxxx69视频 | 色干干| 影音先锋在线视频 | 久久刺激 | 91资源在线播放 | 亚洲成人av一区二区 | 欧美一区二区在线观看视频 | 绿帽av | 一级裸体视频 | 色干综合 | 久久在线视频免费观看 | 明日花绮罗高潮无打码 | 人人草网 | 野花av| 亚洲yy| 日韩不卡一区二区三区 | 30一40一50老女人毛片 | av黄色网 | 日韩激情视频在线 | 色图18p | 看黄网站在线观看 | 国语对白一区二区三区 | 国内自拍第三页 | 丝袜ol美脚秘书在线播放 | 久久视频一区二区三区 | 精品视频第一页 | 女同动漫免费观看高清完整版在线观看 | 亚洲三级色 | 日本天堂在线 | www.x日本| 蜜桃精品成人影片 | 青青草黄色 | 亚洲午夜久久久久久久久 | 亚洲一区电影在线观看 | 色老汉av一区二区三区 | 亚洲黄色精品 | 色诱久久av| 亚洲精品久久久久久宅男 | 五月婷婷综合色 | 一二三四国产精品 | 欧美性受xxx黑人xyx性爽 | 欧美一级全黄 | 中文字幕系列 | 亚洲欧美日韩一区二区三区在线观看 | 国产亚洲精久久久久久无码77777 | 国产第20页 | 久久精品国内 | 18岁免费观看电视连续剧 | 91社区视频 | www.三级.com | 在线观看av国产一区二区 | 国产吃瓜在线 | 十八禁毛片 | 亚洲永久无码7777kkk | 国产在线观看无码免费视频 | 美女视频91| 午夜成人影视 | 国产大屁股喷水视频在线观看 | 国产 欧美 在线 | 在线看片福利 | 精品一区二区在线免费观看 | 欧美 日韩 中文 | 欧美黄色大片免费看 | 国产精品久久久久久久久动漫 | 日本不卡专区 | 96人xxxxxxxxx69 | 欧美成人另类 | 后宫秀女调教(高h,np) | 日韩美女在线视频 | 日韩免费精品 | 欧美日韩在线中文字幕 | 一区二区在线免费视频 | 国产日皮视频 | 中文字幕av一区二区三区谷原希美 |