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()); }
一点点学习,一丝丝进步。不懈怠,才不会被时代淘汰