在windows下测试了redis和memcached的性能,如下:
jedis get 20000次的执行时间:1265毫秒
jedis set 20000次的执行时间:1313毫秒
jedis 同时启动60个线程的执行时间:21609毫秒
xmemcached get执行20000次的时间:3219毫秒
xmemcached set 20000次的执行时间:3000毫秒
xmemcached 同时启动60个线程的执行时间:75562毫秒
可以看出redis的性能要好于memcached!
redis代码:
01
|
public
class
Demo {
|
02
|
03
|
public
static
void
main(String[] args)
throws
Exception {
|
04
|
Demo demo =
new
Demo();
|
05
|
demo.test();
|
06
|
}
|
07
|
|
08
|
public
void
test()
throws
Exception {
|
09
|
Jedis jedis =
new
Jedis(
"localhost"
);
|
10
|
jedis.set(
"key"
,
"mykey"
);
|
11
|
|
12
|
long
begin = System.currentTimeMillis();
|
13
|
for
(
int
i=
0
; i<
20000
; i++)
|
14
|
jedis.get(
"key"
);
|
15
|
long
end = System.currentTimeMillis();
|
16
|
System.out.println(
"jedis get20000次的执行时间:"
+ (end - begin) +
"毫秒"
);
|
17
|
|
18
|
begin = System.currentTimeMillis();
|
19
|
for
(
int
i=
0
; i<
20000
; i++)
|
20
|
jedis.set(String.valueOf(i), String.valueOf(i));
|
21
|
end = System.currentTimeMillis();
|
22
|
System.out.println(
"jedis set 20000次的执行时间:"
+ (end - begin) +
"毫秒"
);
|
23
|
|
24
|
begin = System.currentTimeMillis();
|
25
|
Thread t[] =
new
Thread[
60
];
|
26
|
for
(
int
j=
0
; j<t.length; j++) {
|
27
|
t[j] =
new
TestThread();
|
28
|
t[j].start();
|
29
|
}
|
30
|
|
31
|
for
(
int
j=
0
; j<t.length; j++) {
|
32
|
t[j].join();
|
33
|
}
|
34
|
end = System.currentTimeMillis();
|
35
|
System.out.println(
"jedis 启动"
+ t.length +
"个线程的执行时间:"
+ (end - begin) +
"毫秒"
);
|
36
|
}
|
37
|
38
|
class
TestThread
extends
Thread {
|
39
|
40
|
@Override
|
41
|
public
void
run() {
|
42
|
Jedis jedis =
new
Jedis(
"localhost"
);
|
43
|
for
(
int
i=
0
; i<
20000
; i++)
|
44
|
jedis.get(String.valueOf(i));
|
45
|
jedis.disconnect();
|
46
|
}
|
47
|
|
48
|
}
|
49
|
}
|
测试redis的代码时,发现同时启动的线程只能到达63,超过的线程都会失败。
排查很久,发现配置文件中有一句话:it's up to the number of file descriptors the Redis process is able to open.
估计在windows xp下只能到达64,那么还有一个呢?无法得知,查了好久也没有找到和linux下文件描述符想匹配的东西。
xmemcache代码:
01
|
public
class
Demo {
|
02
|
03
|
public
static
void
main(String[] args)
throws
Exception {
|
04
|
Demo demo =
new
Demo();
|
05
|
demo.test();
|
06
|
}
|
07
|
|
08
|
public
void
test()
throws
Exception {
|
09
|
MemcachedClient mc =
new
XMemcachedClient(
"localhost"
,
11211
);
|
10
|
mc.set(
"key"
,
2000
,
"mykey"
);
|
11
|
|
12
|
long
begin = System.currentTimeMillis();
|
13
|
for
(
int
i=
0
; i<
20000
; i++)
|
14
|
mc.get(
"key"
,
1000
);
|
15
|
long
end = System.currentTimeMillis();
|
16
|
|
17
|
System.out.println(
"memcached get执行20000次的时间:"
+ (end - begin) +
"毫秒"
);
|
18
|
|
19
|
begin = System.currentTimeMillis();
|
20
|
for
(
int
i=
0
; i<
20000
; i++)
|
21
|
mc.set(String.valueOf(i),
2000
,String.valueOf(i));
|
22
|
end = System.currentTimeMillis();
|
23
|
System.out.println(
"memcached set 20000次的执行时间:"
+ (end - begin) +
"毫秒"
);
|
24
|
|
25
|
mc.shutdown();
|
26
|
|
27
|
begin = System.currentTimeMillis();
|
28
|
Thread t[] =
new
Thread[
60
];
|
29
|
for
(
int
j=
0
; j<t.length; j++) {
|
30
|
t[j] =
new
TestThread();
|
31
|
t[j].start();
|
32
|
}
|
33
|
|
34
|
for
(
int
j=
0
; j<t.length; j++) {
|
35
|
t[j].join();
|
36
|
}
|
37
|
end = System.currentTimeMillis();
|
38
|
System.out.println(
"memcached 启动"
+ t.length +
"个线程的执行时间:"
+ (end - begin) +
"毫秒"
);
|
39
|
}
|
40
|
41
|
class
TestThread
extends
Thread {
|
42
|
43
|
@Override
|
44
|
public
void
run() {
|
45
|
try
{
|
46
|
MemcachedClient mc =
new
XMemcachedClient(
"localhost"
,
11211
);
|
47
|
for
(
int
i=
0
; i<
20000
; i++)
|
48
|
mc.get(String.valueOf(i),
1000
);
|
49
|
mc.shutdown();
|
50
|
}
|
51
|
catch
(Exception e) {
|
52
|
|
53
|
}
|
54
|
}
|
55
|
|
56
|
}
|
57
|
}
|