package xyz.anduo.crawler.hash;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import junit.framework.TestCase;
public class ConsistentHashTest extends TestCase {
private static final String IP_PREFIX = "192.168.1.";// 机器节点IP前缀
public void test() {
Map<String, Integer> map = new HashMap<String, Integer>();// 每台真实机器节点上保存的记录条数
List<Node<String>> nodes = new ArrayList<Node<String>>();// 真实机器节点
// 10台真实机器节点集群
for (int i = 1; i <= 10; i++) {
map.put(IP_PREFIX + i, 0);// 每台真实机器节点上保存的记录条数初始为0
Node<String> node = new Node<String>(IP_PREFIX + i, "node_" + i);
nodes.add(node);
}
HashFunction hashFunction = new HashFunctionImpl(); // hash函数实例
ConsistentHash<Node<String>> consistentHash =
new ConsistentHash<Node<String>>(hashFunction, 100, nodes);// 每台真实机器引入100个虚拟节点
// 将5000条记录尽可能均匀的存储到10台机器节点
for (int i = 0; i < 5000; i++) {
// 产生随机一个字符串当做一条记录,可以是其它更复杂的业务对象,比如随机字符串相当于对象的业务唯一标识
String data = UUID.randomUUID().toString() + i;
// 通过记录找到真实机器节点
Node<String> node = consistentHash.get(data);
// 再这里可以能过其它工具将记录存储真实机器节点上,比如MemoryCache等
// ...
// 每台真实机器节点上保存的记录条数加1
map.put(node.getIp(), map.get(node.getIp()) + 1);
}
// 打印每台真实机器节点保存的记录条数
for (int i = 1; i <= 10; i++) {
System.out.println(IP_PREFIX + i + "节点记录条数:" + map.get("192.168.1." + i));
}
}
}