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());
}
本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/14909338.html

浙公网安备 33010602011771号