亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Jedis下的ShardedJedis(分布式)使用方法(二)

2019-11-14 14:51:55
字體:
來源:轉載
供稿:網友

上一篇中介紹了ShardedJedis的基本使用方法以及演示了一個簡單的例子,在這一篇中我們來介紹了ShardedJedis的原理。

 

1.ShardedJedis內部實現

首先我們來看一下ShardedJedis的一個繼承關系

 

看完了圖,那么我們一步一步跟著我們的代碼調用來看,以我們最簡單的%20ShardedJedis.get(key)方法為例:

%20%20public%20String%20get(String%20key)%20{%20%20%20%20Jedis%20j%20=%20getShard(key);%20%20%20%20return%20j.get(key);%20%20}

 

這邊有調用一個getShard%20方法,參數為我們傳入的key,然后返回一個普通的jedis對象,那么這個getShard是用來做什么的呢,大家可能已經猜到了,這個方法就是會根據我們傳入的key做一致性哈希判斷,然后返回key落到的那個redis實例上的一個redis連接,不同的key返回的redis連接可能是不同的。

 

進入getShard%20方法,你會發現這個實現是在Sharded類中實現的(看上面的類圖可以發現頂層的Sharded類),代碼如下:

public%20R%20getShard(String%20key)%20{%20%20%20%20return%20resources.get(getShardInfo(key));%20%20}%20%20public%20S%20getShardInfo(byte[]%20key)%20{%20%20%20%20SortedMap<Long,%20S>%20tail%20=%20nodes.tailMap(algo.hash(key));%20%20%20%20if%20(tail.isEmpty())%20{%20%20%20%20%20%20return%20nodes.get(nodes.firstKey());%20%20%20%20}%20%20%20%20return%20tail.get(tail.firstKey());%20%20}%20%20public%20S%20getShardInfo(String%20key)%20{%20%20%20%20return%20getShardInfo(SafeEncoder.encode(getKeyTag(key)));%20%20}

 

上面的方法是層層調用的關系,在這邊不細說,我們主要看下第二個方法(getShardInfo(byte[]%20key))實現(上面的nodes變量是一個TreeMap%20類型,%20algo%20Hashing類型,即key分片所使用的hash算法,這個在前一篇有簡單說過),那么這段代碼的含義我們大概成猜出來了,

  1. 就是在一個TreeMap中取出大于等于key之后的部分視圖SortMap
  2. 在SortMap取得第一個鍵值對的值,然后返回一個%20S%20對象,
  3. 然后根據這個S%20對象,去resources(resources%20=%20new%20LinkedHashMap<ShardInfo<R>,%20R>())中get一個R對象

 

那么這個S、%20R對象各自代表什么呢?看下面的代碼

public%20class%20Sharded<R,%20S%20extends%20ShardInfo<R>>
public%20class%20BinaryShardedJedis%20extends%20Sharded<Jedis,%20JedisShardInfo>%20implements%20%20%20%20BinaryJedisCommands

可以得出 %20S%20=%20JedisShardInfo,%20R%20=%20Jedis%20對象,即在TreeMap存儲了服務器劃分的虛擬節點的信息,LinkedHashMap中存儲了服務器的物理連接。 

 

JedisShardInfo具體信息如下:里面包含了jedis服務器的一些信息,最重要的是它的父類中有一個weight字段,作為本jedis服務器的權值。

 

ok,那我們了解了實際上就是根據jedis服務器的信息去獲取一個jedis的連接,返回給上層調用。

 

我們可以梳理下這個邏輯:

  1. 當我們使用ShardedJedis去查一個key時,首先它會把這個key進行一個hash算法
  2. 根據這個hash值然后去treeMap中,查出這個key落在哪個實例中,并返回redis實例對應的具體信息
  3. 根據這個redis的實例信息,到一個保存jedis鏈接和實例信息對應關系的LinkedHashMap中找到這個jedis連接
  4. 最終返回jedis連接,執行對象的命令操作(到這步后實際上和單機操作一樣了)

那么我們的nodes 服務器虛擬節點和resources 服務器物理連接是什么時候初始化的呢,接下來繼續看

 

2.redis虛擬節點(nodes)和物理連接(resources) 初始化

我們繼續看Sharded的構造方法

public Sharded(List<S> shards, Hashing algo) {    this.algo = algo;    initialize(shards);  }public Sharded(List<S> shards, Hashing algo, Pattern tagPattern) {    this.algo = algo;    this.tagPattern = tagPattern;    initialize(shards);  }

 

這邊有一個initialize方法,就是用來對虛擬節點和物理連接進行初始化的,看其實現

PRivate void initialize(List<S> shards) {    nodes = new TreeMap<Long, S>();    for (int i = 0; i != shards.size(); ++i) {      final S shardInfo = shards.get(i);      if (shardInfo.getName() == null) for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {        nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n), shardInfo);      }      else for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {        nodes.put(this.algo.hash(shardInfo.getName() + "*" + shardInfo.getWeight() + n), shardInfo);      }      resources.put(shardInfo, shardInfo.createResource());    }  }

 

具體細節就不說了,根據上面的,我們就知道是在這邊進行了初始化,將每臺服務器節點采用hash算法劃分為160個虛擬節點(可以配置劃分權重),保存在TreeMap中,

然后把每臺服務器節點的信息和物理連接以鍵值對保存LinkedHashMap中。

 

然后通過一系列的查找,發現Sharded的構造方法其實是在我們 jedisPool.getResource() 時就完成的

  //初始化ShardedJedisPool        List<JedisShardInfo> infoList = Arrays.asList(shardInfo1, shardInfo2, shardInfo3);        ShardedJedisPool jedisPool = new ShardedJedisPool(poolConfig, infoList);        ShardedJedis jedis = jedisPool.getResource();

 

 

納尼? 每次jedisPool.getResource() 才初始化?那會不會造成很慢呢,其實不用擔心,其底層是使用了commons.pool進行連接池的一些操作,會根據我們配置的連接池參數來生成對應的連接并保存,其中的細節很復雜,博主沒有繼續深究,實現其實和數據庫連接池是一致的。

 

3.總結

 

ShardedJedis分布式具體的的實現思路:

 好了,大概的實現如上面所說的,都是圖可能會有點亂,大家如果有什么問題或者發現了什么錯誤,please tell me!

 


上一篇:tomcat啟動錯誤——Achildcontainerfailedduringstart(問題已解決)

下一篇:Eclipse中java項目轉web項目的方法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片
猜你喜歡的新聞
猜你喜歡的關注

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久国产精品网站| 亚洲毛片一区二区| 欧美在线观看视频| 久久综合电影一区| 中文字幕欧美日韩va免费视频| 亚洲日本欧美日韩高观看| 国产精品久久久久久久久久尿| 2024亚洲男人天堂| 日韩av网站导航| 久久亚洲精品网站| 91久久精品国产91久久| 黑人极品videos精品欧美裸| 欧美激情亚洲精品| 欧美中文字幕第一页| 久久久亚洲影院| 亚洲精品丝袜日韩| 欧美精品激情在线观看| 日韩欧美成人网| 性色av一区二区三区在线观看| 成人国产精品久久久| 91超碰caoporn97人人| 国产精品99免视看9| 欧美午夜美女看片| 久久香蕉精品香蕉| 91精品中国老女人| 久久99视频免费| 久久国内精品一国内精品| 日韩经典中文字幕| 狠狠干狠狠久久| 中文字幕自拍vr一区二区三区| 亚洲第一免费播放区| 欧美成人自拍视频| 国产精品福利观看| 中文字幕视频一区二区在线有码| 亚洲第一精品久久忘忧草社区| 亚洲精品永久免费| 国产精品第一第二| 91精品国产成人| 亚洲人成毛片在线播放| 精品国产拍在线观看| 国产91色在线播放| 国产精品久久久久久av福利软件| 国产精品自产拍在线观| 亚洲r级在线观看| 欧美午夜www高清视频| 日韩精品高清视频| 亚洲精品动漫久久久久| 国产一区二区三区四区福利| 揄拍成人国产精品视频| 国产精品久久久久久一区二区| 福利视频一区二区| 国产aⅴ夜夜欢一区二区三区| 国产精品色婷婷视频| 国产精品国产三级国产专播精品人| 97在线精品国自产拍中文| 色噜噜国产精品视频一区二区| 中文字幕在线观看日韩| 亚洲国产成人久久综合| 懂色av中文一区二区三区天美| 成人国产亚洲精品a区天堂华泰| 久久亚洲私人国产精品va| www亚洲欧美| 国产精品日韩在线观看| 在线一区二区日韩| 国产精品视频色| 亚洲欧美日本精品| 大荫蒂欧美视频另类xxxx| 亚洲人高潮女人毛茸茸| 久久久久久久久电影| 亚洲一区二区久久久久久久| 色婷婷综合久久久久| 亚洲国内精品在线| 欧美日韩在线免费观看| 亚洲级视频在线观看免费1级| 亚洲国产中文字幕在线观看| 欧美天堂在线观看| 国内揄拍国内精品少妇国语| 亚洲精品视频中文字幕| 久久久久亚洲精品成人网小说| 亚洲欧洲在线视频| 亚洲国产美女久久久久| 伊是香蕉大人久久| 欧美日韩视频在线| 国产视频亚洲视频| 日韩av在线网址| 欧美日韩激情网| 久久精品久久久久久| 97高清免费视频| 日韩中文在线中文网在线观看| 亚洲国产精品99久久| 国产欧美 在线欧美| 亚洲九九九在线观看| 久久人91精品久久久久久不卡| 精品国内亚洲在观看18黄| 成人免费看吃奶视频网站| 国产精品视频精品| 岛国av一区二区在线在线观看| 亚洲免费电影在线观看| 欧美裸体xxxx极品少妇软件| 国内外成人免费激情在线视频网站| 中文.日本.精品| 欧美精品九九久久| 成人黄色av免费在线观看| 精品国产31久久久久久| 国产成人精品视| 中国日韩欧美久久久久久久久| 欧美超级乱淫片喷水| 欧洲午夜精品久久久| 在线观看久久av| 国产精品国产自产拍高清av水多| 粉嫩老牛aⅴ一区二区三区| 91亚洲永久免费精品| 欧美国产亚洲精品久久久8v| 欧美麻豆久久久久久中文| 久色乳综合思思在线视频| 伦伦影院午夜日韩欧美限制| 国产mv久久久| 色综合视频一区中文字幕| 国产精品高潮在线| 在线看福利67194| 日韩激情视频在线| 亚洲天堂av在线免费观看| 亚洲va男人天堂| 国产日韩欧美中文| 国产精品精品视频一区二区三区| 亚洲国产成人在线视频| 久久影视免费观看| 欧美日韩中文字幕综合视频| 欧美高清在线视频观看不卡| 日韩国产高清视频在线| 91精品国产高清久久久久久| 91精品国产91久久久久久| 精品国产一区二区三区在线观看| 欧美日韩黄色大片| 在线播放国产精品| 国产精品美女呻吟| 久久精品成人一区二区三区| 亚洲国产精品久久久久久| 亚洲人成绝费网站色www| 欧美激情在线有限公司| 国产精品网站入口| 国产精品入口免费视频一| 2019中文在线观看| 奇米4444一区二区三区| 中文字幕精品一区久久久久| 久久99久久99精品中文字幕| 成人久久一区二区三区| 久久久噜噜噜久久中文字免| 日韩电影免费观看中文字幕| 日本成人在线视频网址| 欧美与欧洲交xxxx免费观看| 日韩av理论片| 操人视频在线观看欧美| 欧美乱大交xxxxx另类电影| 亚洲欧洲国产伦综合| 成人av资源在线播放| 国产美女精品视频免费观看| 国产视频精品xxxx| 91高清视频免费| 欧美日韩中文字幕| 俺去亚洲欧洲欧美日韩| 亚洲天堂av在线免费| 在线精品高清中文字幕| 色系列之999|