一致性hash与treemap
所属分类 architecture
浏览量 1383
jedis 客户端 一致性hash 关键代码
节点hash环构建
for (int i = 0; i != shards.size(); ++i) {
for(int n = 0; n < 160 * shardInfo.getWeight(); n++) {
nodes.put(this.algo.hash(shardInfo.getName() + "*" + n), shardInfo);
}
}
虚拟节点数 160
hash算法 Hashing.MURMUR_HASH
设置分片 name
可以设置成 host + port
List< JedisShardInfo> shardInfoList =new ArrayList< JedisShardInfo>();
JedisShardInfo infoA = new JedisShardInfo("127.0.0.1", 6379,"127.0.0.1:6379");
JedisShardInfo infoB = new JedisShardInfo("127.0.0.1", 6380,"127.0.0.1:6380");
shardInfoList.add(infoA);
shardInfoList.add(infoB);
根据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());
}
TreeMap 的 tailMap() firstKey() 方法使用
public SortedMap< K,V> tailMap(K fromKey)
返回 key 大于或等于 fromKey的部分视图
一致性hash简单实现及测试
https://gitee.com/dyyx/redisdemo/blob/master/src/main/java/dyyx/SimpleConsistHashDemo.java
treemap 实例
https://gitee.com/dyyx/redisdemo/blob/master/src/main/java/dyyx/TreeMapTest.java
上一篇
下一篇
B树与红黑树,为什么数据库使用B树索引
联合索引与最左匹配原则
Jedis客户端分片机制
MapReduce和Tez比较
redis 主从 哨兵 集群机制
CDH组件版本查看