forked from pyb1993/JavaRedis
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRedisStringPool.java
More file actions
68 lines (56 loc) · 1.89 KB
/
RedisStringPool.java
File metadata and controls
68 lines (56 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package RedisDataBase;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashMap;
public class RedisStringPool extends AbstractObjectPool<RedisString>{
// 这是因为范型数组没有办法在AbstractObjectPool里面初始化,所以不得不在子类确定类型之后进行
class StringConatiner extends ObjectContainer{
public StringConatiner(int len){
super(len);
}
}
public ObjectContainer getSubObjContainer(int size){
return new StringConatiner(size);
}
public RedisStringPool(){
super();
}
@Override
public void initLengthTable(){
// todo 实现长度表
super.lengthTable = new int[]{4,8,16,32,48,64,96,128,256,512,1024,1536,2048,3092,4096,6114,8192};
// todo 未来可以优化
super.lenIndexMap = new HashMap<>(){
{
for(int i = 0; i < lengthTable.length; ++i){
put(lengthTable[i],i);
}
}
};
}
// 用来在没有从池化数据里面获得数据的时候初始化
@Override
public RedisString newInstance(int len){
return new RedisString(len);
}
// 避免直接分配
public RedisString getString(String s){
byte[] bytes = s.getBytes();
return getString(bytes,0,bytes.length);
}
public RedisString getString(RedisString s,int start,int size){
return getString(s.bytes,start,size);
}
// 因为String需要直接用byte初始化,所以单独写一个方法
public RedisString getString(byte[] b,int pos,int len){
RedisString ret = allocate(len);
ret.size = len;
System.arraycopy(b,pos,ret.bytes,0,len);
// 将这个String拷贝过来
return ret;
}
@Override
public void initObjectPool(){
super.objectPool = new StringConatiner[lengthTable.length];
}
}