Skip to content

Commit 4855d41

Browse files
committed
+
1 parent 5b7e761 commit 4855d41

12 files changed

+807
-109
lines changed
+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
*
3+
*/
4+
package io.vakin.algorithm;
5+
6+
import java.nio.ByteBuffer;
7+
import java.nio.ByteOrder;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
import java.util.SortedMap;
11+
import java.util.TreeMap;
12+
13+
/**
14+
* @description <br>
15+
* @author <a href="mailto:[email protected]">vakin</a>
16+
* @date 2016年8月22日
17+
*/
18+
public class ConsistencyHash {
19+
private TreeMap<Long, String> virtualNodes = new TreeMap<Long, String>();
20+
21+
// 设置虚拟节点数目
22+
private static final int VIRTUAL_NUM = 32;
23+
24+
25+
26+
public ConsistencyHash(List<String> actualNodes) {
27+
refresh(actualNodes);
28+
}
29+
30+
public void refresh(List<String> actualNodes){
31+
virtualNodes.clear();
32+
for (int i = 0; i < actualNodes.size(); i++) {
33+
String shardInfo = actualNodes.get(i);
34+
for (int j = 0; j < VIRTUAL_NUM; j++) {
35+
virtualNodes.put(hash(i + "-" + j), shardInfo);
36+
}
37+
}
38+
}
39+
40+
/**
41+
* 根据hash因子获取分配的真实节点
42+
*
43+
* @param factor
44+
* @return
45+
*/
46+
public String getActualNode(Object factor) {
47+
Long key = hash(factor.toString());
48+
SortedMap<Long, String> tailMap = virtualNodes.tailMap(key);
49+
if (tailMap.isEmpty()) {
50+
key = virtualNodes.firstKey();
51+
} else {
52+
key = tailMap.firstKey();
53+
}
54+
return virtualNodes.get(key);
55+
}
56+
57+
private static Long hash(String key) {
58+
if(key == null)return 0L;
59+
ByteBuffer buf = ByteBuffer.wrap(key.getBytes());
60+
int seed = 0x1234ABCD;
61+
62+
ByteOrder byteOrder = buf.order();
63+
buf.order(ByteOrder.LITTLE_ENDIAN);
64+
65+
long m = 0xc6a4a7935bd1e995L;
66+
int r = 47;
67+
68+
long h = seed ^ (buf.remaining() * m);
69+
70+
long k;
71+
while (buf.remaining() >= 8) {
72+
k = buf.getLong();
73+
74+
k *= m;
75+
k ^= k >>> r;
76+
k *= m;
77+
78+
h ^= k;
79+
h *= m;
80+
}
81+
82+
if (buf.remaining() > 0) {
83+
ByteBuffer finish = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
84+
finish.put(buf).rewind();
85+
h ^= finish.getLong();
86+
h *= m;
87+
}
88+
89+
h ^= h >>> r;
90+
h *= m;
91+
h ^= h >>> r;
92+
93+
buf.order(byteOrder);
94+
return Math.abs(h);
95+
}
96+
97+
public static void main(String[] args) {
98+
List<String> actualNodes = Arrays.asList("192.168.1.100","192.168.1.101","192.168.1.102","192.168.1.103");
99+
ConsistencyHash hash = new ConsistencyHash(actualNodes);
100+
for (int i = 0; i < VIRTUAL_NUM; i++) {
101+
System.out.println(hash.getActualNode(i));
102+
}
103+
}
104+
105+
}

src/io/vakin/algorithm/LRU.java

+83-108
Original file line numberDiff line numberDiff line change
@@ -5,121 +5,96 @@
55

66
public class LRU<K, V> implements Iterable<K> {
77

8-
private Node head;
9-
private Node tail;
10-
private HashMap<K, Node> map;
11-
private int maxSize;
12-
13-
private class Node {
8+
int capacity;
9+
HashMap<K, Node> map = new HashMap<K, Node>();
10+
Node head=null;
11+
Node end=null;
12+
13+
public LRU(int capacity) {
14+
this.capacity = capacity;
15+
}
16+
17+
public V get(K key) {
18+
if(map.containsKey(key)){
19+
Node n = map.get(key);
20+
remove(n);
21+
setHead(n);
22+
return n.value;
23+
}
24+
25+
return null;
26+
}
27+
28+
public void remove(Node n){
29+
if(n.pre!=null){
30+
n.pre.next = n.next;
31+
}else{
32+
head = n.next;
33+
}
34+
35+
if(n.next!=null){
36+
n.next.pre = n.pre;
37+
}else{
38+
end = n.pre;
39+
}
40+
41+
}
42+
43+
public void setHead(Node n){
44+
n.next = head;
45+
n.pre = null;
46+
47+
if(head!=null)
48+
head.pre = n;
49+
50+
head = n;
51+
52+
if(end ==null)
53+
end = head;
54+
}
55+
56+
public void set(K key, V value) {
57+
if(map.containsKey(key)){
58+
Node old = map.get(key);
59+
old.value = value;
60+
remove(old);
61+
setHead(old);
62+
}else{
63+
Node created = new Node(key, value);
64+
if(map.size()>=capacity){
65+
map.remove(end.key);
66+
remove(end);
67+
setHead(created);
68+
69+
}else{
70+
setHead(created);
71+
}
72+
73+
map.put(key, created);
74+
}
75+
}
76+
77+
@Override
78+
public Iterator<K> iterator() {
79+
return map.keySet().iterator();
80+
}
81+
82+
83+
private class Node {
1484

1585
Node pre;
1686
Node next;
17-
K k;
18-
V v;
87+
K key;
88+
V value;
1989

2090
public Node(K k, V v) {
21-
this.k = k;
22-
this.v = v;
91+
this.key = k;
92+
this.value = v;
2393
}
2494
}
25-
26-
public LRU(int maxSize) {
27-
28-
this.maxSize = maxSize;
29-
this.map = new HashMap<>(maxSize * 4 / 3);
30-
}
31-
32-
public V get(K key) {
33-
34-
if (!map.containsKey(key)) {
35-
return null;
36-
}
37-
38-
Node node = map.get(key);
39-
unlink(node);
40-
appendHead(node);
41-
42-
return node.v;
43-
}
44-
45-
public void put(K key, V value) {
46-
47-
if(head == null){
48-
head = new Node(key, value);
49-
tail = head;
50-
return;
51-
}
52-
if (map.containsKey(key)) {
53-
Node node = map.get(key);
54-
unlink(node);
55-
}
56-
57-
Node node = new Node(key, value);
58-
map.put(key, node);
59-
appendHead(node);
60-
61-
if (map.size() > maxSize) {
62-
Node toRemove = removeTail();
63-
map.remove(toRemove);
64-
}
65-
}
66-
67-
private void unlink(Node node) {
68-
Node pre = node.pre;
69-
Node next = node.next;
70-
if(pre == null){
71-
}else {
72-
pre.next = next;
73-
next.pre = pre;
74-
}
75-
}
76-
77-
private void appendHead(Node node) {
78-
node.next = head;
79-
head.pre = node;
80-
}
81-
82-
private Node removeTail() {
83-
Node node = tail;
84-
if(node == null)return null;
85-
tail = tail.pre;
86-
return node;
87-
}
88-
89-
@Override
90-
public Iterator<K> iterator() {
91-
92-
return new Iterator<K>() {
93-
94-
private Node cur = head.next;
95-
96-
@Override
97-
public boolean hasNext() {
98-
return cur != tail;
99-
}
100-
101-
@Override
102-
public K next() {
103-
Node node = cur;
104-
cur = cur.next;
105-
return node.k;
106-
}
107-
};
108-
}
109-
110-
public static void main(String[] args) {
111-
LRU<Object, Object> lru = new LRU<>(10);
112-
for (int i = 0; i < 5; i++) {
113-
lru.put(i, i);
114-
}
115-
116-
lru.get(3);
117-
lru.get(2);
118-
119-
Iterator<Object> iterator = lru.iterator();
120-
while(iterator.hasNext()){
121-
System.out.println(iterator.next());
122-
}
95+
96+
public static void main(String[] args) {
12397

12498
}
99+
125100
}

0 commit comments

Comments
 (0)