码迷,mamicode.com
首页 > 其他好文 > 详细

jedis的ShardedJedisPool链接池的扩容成绩

时间:2019-10-10 00:32:21      浏览:36      评论:0      收藏:0      [点我收藏+]

标签:操作   turn   连接池   tag   des   color   encoder   nbsp   sort   

回想上一篇文章jedis连接池的构建。

我们来分析ShardedJedisPool的基于客户端分片所能够带来的成绩:扩容

ShardedJedisPool的节点扩容 。ShardedJedisPool采取的 是客户端分片形式 ,我们来看一下Sharded的初始化代码,获得节点信息后,其节点按照权重*160个的虚拟节点,将创建的节点放在TreeMap中,value为虚拟节点对应的 正式分片信息。

 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());
    }
  }
 

至于为甚么创建160个虚拟节点与分歧性hash分歧,单一的节点很能够招致数据的分布不均。

 

厥后只需遵守异样的 规矩,set和get,便可满足雷同的 key到雷同的 节点上,其代码以下:

厥后我们在每次之心jedis操作是先经过过程可以获得其对应的连接,其代码以下,其依附于treemapd.tailMap()完成:

public R getShard(String key) {
    return resources.get(getShardInfo(key));
  }

  public S getShardInfo(byte[] key) {
    SortedMap<Long, S> tail = nodes.tailMap(algo.hash(key));
    if (tail.isEmpty()) {
      return nodes.get(nodes.firstKey());
    }
    return tail.get(tail.firstKey());
  }

  public S getShardInfo(String key) {
    return getShardInfo(SafeEncoder.encode(getKeyTag(key)));
  }

回到我们的成绩,扩容

虚拟节点的创建将数据均匀的分布到各个节点,然则随着节点的扩容,伴随的成绩节点数据的迁徙与拷贝,然则甚么节点此hash其实不是分歧性hash,也不是集群形式可以很轻易的分派槽点,我们也很难肯定甚么样的数据须要拷贝到甚么新的节点,所以这就给节点扩容带来了艰苦,扩容必定存在redis数据的损掉,须要有照应的 兼容战略,如数据缺掉的兜底战略。

那么我们有甚么办法来防止这类情况么 ?

最简单的 就是 prehash,即提早创建相对多的分片,可以将多个集中在单台办事器上,这固然会带来必定资本的浪费,然则在数据收缩须要迁徙时,我们只需将照应的节点迁徙出去,就防止了扩容的 成绩。

 

jedis的ShardedJedisPool链接池的扩容成绩

标签:操作   turn   连接池   tag   des   color   encoder   nbsp   sort   

原文地址:https://www.cnblogs.com/lianshan/p/11644925.html

(0)
(0)
   
告发
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权一切 京ICP备13008772号-2
迷上了代码!