redis 分片

1.使用客户端的分配分片(可以自定义配置,缺点:节点增加,服务就要改代码,不灵活)
  JedisPoolConfig poolConfig=new JedisPoolConfig();
        JedisShardInfo jedisShardInfo1=new JedisShardInfo("127.0.0.1",6379);
        jedisShardInfo1.setPassword("123456");
        JedisShardInfo jedisShardInfo2=new JedisShardInfo("115.29.140.141",6800);
        jedisShardInfo2.setPassword("Wang_Biao-22@1317");

        List<JedisShardInfo> infos=Arrays.asList(jedisShardInfo1,jedisShardInfo2);
        ShardedJedisPool shardedJedisPool=new ShardedJedisPool(poolConfig,infos);
        ShardedJedis jedis=null;

        try {
            jedis=shardedJedisPool.getResource();
            for (int i = 1; i <=100 ; i++) {
                jedis.set("K"+i,""+i);
                jedis.expire("K"+i,300);
            }
            for (int i = 0; i <100 ; i++) {
                Client client=jedis.getShard("K"+i).getClient();
                System.out.println("取到的值:"+jedis.get("K"+i)+","+"当前key位于:"+client.getHost()+":"+client.getPort());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(jedis!=null){
                jedis.close();
            }
        }


2.Twemproxy
3.Codis

 

源码解析:
获取真正的客户端:
                Client client=jedis.getShard("K"+i).getClient();

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




  public S getShardInfo(byte[] key) {
     // 获取比当前key的哈希值要大的红黑树的子集
        SortedMap<Long, S> tail = this.nodes.tailMap(this.algo.hash(key));
      
        return tail.isEmpty() ? 
     // 没有比它大的了,直接从nodes中取出
      (ShardInfo)this.nodes.get(this.nodes.firstKey()) : 
       // 返回第一个比它大的JedisShardInfo
      (ShardInfo)tail.get(tail.firstKey());
    }

 

posted @ 2021-06-20 23:03  余生请多指教ANT  阅读(91)  评论(0编辑  收藏  举报