java连接memcached,并对比从数据库中查询数据与从memcached查询的性能
2012-12-28 14:50
666 查看
说明:
系统为:rhel5.3 32
memcached版本为:yum安装的1.4.5-1.el5
jdk版本为:jdk1.6.0_29
mysql版本为:mysql-5.5.17-winx64.zip
eclipse版本为:eclipse-jee-indigo-SR1-linux-gtk.tar.gz
参考:
xmemcached user_guide
http://code.google.com/p/xmemcached/wiki/User_Guide_zh
mysql+memcache+java(xmemcached)例子
http://f.dataguru.cn/forum.php?mod=viewthread&tid=44158&fromuid=4771
xmemcached + 3节点memcached 试验
http://f.dataguru.cn/forum.php?mod=viewthread&tid=44203&fromuid=4771
本试验所有的源文件、jar包下载:
源文件及jar包.rar
(1.53 MB, 下载次数: 0, 售价: 1 金子)
2012-12-27 23:33 上传
下载次数: 0
售价: 1 金子 [记录] [购买]
下载积分: 金子 -1
不过源文件的内容我基本上都有贴出来。。
试验准备:
如图:新建一个工程,导入五个jar包,并准备一个log4j配置文件放置于src目录下。
log4j文件内容:
log4j.debug=false
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %d{HH:mm:ss} (%F:%L) - %m%n
复制代码
log4j的配置,可以自己定制,我是懒得搞了,直接copy的。。
为了循循渐进的演示效果,我把试验中需要的代码分开了,便于一步一步实验。
PS:为了代码逻辑简单明了,也因为我太懒了,代码随意写的,完全没有面向对象,没有可扩展性、没有可维护性,仅作为本次测试参考!
此外,代码中我把Exception直接抛出去,没有百分之百把握定位Exception的筒子们,还是老老实实的try...catch处理!
2012-12-27 20:09 上传
下载附件
(40.53 KB)
一、测试连接memcached:
确保你memcached已经安装成功,如果没有,参考:
Redhat/CentOS使用yum报错的完美解决方案(顺带yum安装memcached)
http://f.dataguru.cn/forum.php?mod=viewthread&tid=44212&fromuid=4771
确保上图中的前四个jar包已经被引入,新建测试类TestConn2Mem.java,代码:
package com.oracle.biao.memcached;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.utils.AddrUtil;
public class TestConn2Mem {
public static void main(String[] args) throws Exception {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211"));
MemcachedClient memcachedClient = builder.build();
memcachedClient.set("hello", 0, "hello,memcached!");
String value = memcachedClient.get("hello");
System.out.println("hello=" + value);
memcachedClient.delete("hello");
System.out.println("hello has been deleted...");
value = memcachedClient.get("hello");
System.out.println("hello=" + value);
memcachedClient.shutdown();
}
}
复制代码
运行结果为:
WARN 20:17:07 (XMemcachedClient.java:674) - XMemcachedClient use Text protocol
INFO 20:17:08 (SelectorManager.java:37) - Creating 4 reactors...
WARN 20:17:08 (AbstractController.java:372) - The Controller started at localhost/127.0.0.1:0 ...
WARN 20:17:08 (MemcachedConnector.java:234) - Add a session: 127.0.0.1:11211
hello=hello,memcached!
hello has been deleted...
hello=null
WARN 20:17:08 (MemcachedConnector.java:348) - Remove a session: 127.0.0.1:11211
INFO 20:17:08 (AbstractController.java:478) - Controller has been stopped.
复制代码
如上所示,java连接memcached成功。
二、测试连mysql数据库:
确保mysql数据库已经安装,如果没有,参考:
Win7下MySQL解压缩版安装配置
http://f.dataguru.cn/forum.php?mod=viewthread&tid=34746&fromuid=4771
1、首先在数据库中建立相应的测试表以及构造些测试数据:
mysql> create table test_memcached(id int primary key auto_increment, value varchar(30) not null);
Query OK, 0 rows affected (0.14 sec)
复制代码
2、确保上图中的mysql-connector-java-*-bin.jar包已经被引入,新建测试类TestConn2MySQL.java,代码:
package com.oracle.biao.memcached;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestConn2MySQL {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.4:3306/test", "root", "root");
String sql = "select count(*) from test_memcached";
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(sql);
rs.next();
String rows = rs.getString(1);
System.out.println("Current rows is " + rows);
rs.close();
stat.close();
conn.close();
}
}
复制代码
运行结果为:
Current rows is 6
复制代码
如上所示,在mysql数据库中插入的6条数据被获得,连接mysql成功。
三、为性能对比测试准备数据:
确保前两步都已经试验成功,新建工具类DataGenerator.java,代码:
package com.oracle.biao.memcached;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.utils.AddrUtil;
public class DataGenerator {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.4:3306/test", "root", "root");
String sql = "select count(*) from test_memcached";
Statement stat = conn.createStatement();
stat.executeUpdate("truncate table test_memcached");
System.out.println("truncated table test_memcached......");
ResultSet rs = stat.executeQuery(sql);
for (int i = 100; i < 600; i++) {
stat.addBatch("insert into test_memcached(value) values('test" + i + "')");
}
int[] rows = stat.executeBatch();
System.out.println("inserted " + rows.length + " rows......");
rs.close();
stat.close();
conn.close();
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211"));
MemcachedClient memcachedClient = builder.build();
for (int i = 100; i < 600; i++) {
memcachedClient.delete(""+i);
}
System.out.println("purge memcached......");
for (int i = 100; i < 600; i++) {
memcachedClient.set(""+i, 0, "test"+i);
}
System.out.println("set 600 entries into memcached......");
memcachedClient.shutdown();
}
}
复制代码
运行完之后将会在mysql插入500条数据,并将相同的数据set进memcached中。运行后的控制台信息:
truncated table test_memcached......
inserted 500 rows......
WARN 20:37:19 (XMemcachedClient.java:674) - XMemcachedClient use Text protocol
INFO 20:37:19 (SelectorManager.java:37) - Creating 4 reactors...
WARN 20:37:19 (AbstractController.java:372) - The Controller started at localhost/127.0.0.1:0 ...
WARN 20:37:19 (MemcachedConnector.java:234) - Add a session: 127.0.0.1:11211
purge memcached......
set 600 entries into memcached......
复制代码
看到如上信息后,可以再用代码,或者直接查询,验证数据是否已正确构造。此处略,都懂的。。
四、比较从数据库中查询数据和从memcached中查询数据的性能:
确保前三步都已经试验成功,新建测试类TestPerformance.java,代码:
package com.oracle.biao.memcached;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import net.rubyeye.xmemcached.KeyIterator;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.utils.AddrUtil;
public class TestPerformance {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
long start1 = System.currentTimeMillis();
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.4:3306/test", "root", "root");
//long endConnMySQL = System.currentTimeMillis();
//System.out.println("Connect to mysql, Cost" + (endConnMySQL - start1) + "ms");
String sql = "select * from test_memcached";
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(sql);
while (rs.next()) {
String value = rs.getString(2);
}
long end1 = System.currentTimeMillis();
System.out.println("From mysql query 500 rows, Cost time:" + (end1 - start1) + "ms");
rs.close();
stat.close();
conn.close();
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211"));
MemcachedClient memcachedClient = builder.build();
long start2 = System.currentTimeMillis();
for (int i = 100; i < 600; i++) {
String value = memcachedClient.get(""+i);
}
long end2 = System.currentTimeMillis();
System.out.println("From memcached query 500 rows, Cost time:" + (end2 - start2) + "ms");
memcachedClient.shutdown();
}
}
复制代码
运行结果如下:
From mysql query 500 rows, Cost time:611ms
WARN 11:00:59 (XMemcachedClient.java:674) - XMemcachedClient use Text protocol
INFO 11:00:59 (SelectorManager.java:37) - Creating 4 reactors...
WARN 11:00:59 (AbstractController.java:372) - The Controller started at localhost/127.0.0.1:0 ...
WARN 11:00:59 (MemcachedConnector.java:234) - Add a session: 127.0.0.1:11211
From memcached query 500 rows, Cost time:307ms
WARN 11:00:59 (MemcachedConnector.java:348) - Remove a session: 127.0.0.1:11211
INFO 11:00:59 (AbstractController.java:478) - Controller has been stopped.
复制代码
From mysql query 500 rows, Cost time:611ms
From memcached query 500 rows, Cost time:307ms
从运行结果来看,对于此次测试,memcached性能上的优异还是挺明显的。。
但是,其实这么比较出来的结果的是不严谨的!依照例子而言,mysq的查询时间包括了连接的时间,如果不算连接的时间,结果是相反的:mysql的性能优于memcached好几倍!不信的筒子可以自己测试。
至此,本次试验完成!
系统为:rhel5.3 32
memcached版本为:yum安装的1.4.5-1.el5
jdk版本为:jdk1.6.0_29
mysql版本为:mysql-5.5.17-winx64.zip
eclipse版本为:eclipse-jee-indigo-SR1-linux-gtk.tar.gz
参考:
xmemcached user_guide
http://code.google.com/p/xmemcached/wiki/User_Guide_zh
mysql+memcache+java(xmemcached)例子
http://f.dataguru.cn/forum.php?mod=viewthread&tid=44158&fromuid=4771
xmemcached + 3节点memcached 试验
http://f.dataguru.cn/forum.php?mod=viewthread&tid=44203&fromuid=4771
本试验所有的源文件、jar包下载:
源文件及jar包.rar
(1.53 MB, 下载次数: 0, 售价: 1 金子)
2012-12-27 23:33 上传
下载次数: 0
售价: 1 金子 [记录] [购买]
下载积分: 金子 -1
不过源文件的内容我基本上都有贴出来。。
试验准备:
如图:新建一个工程,导入五个jar包,并准备一个log4j配置文件放置于src目录下。
log4j文件内容:
log4j.debug=false
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %d{HH:mm:ss} (%F:%L) - %m%n
复制代码
log4j的配置,可以自己定制,我是懒得搞了,直接copy的。。
为了循循渐进的演示效果,我把试验中需要的代码分开了,便于一步一步实验。
PS:为了代码逻辑简单明了,也因为我太懒了,代码随意写的,完全没有面向对象,没有可扩展性、没有可维护性,仅作为本次测试参考!
此外,代码中我把Exception直接抛出去,没有百分之百把握定位Exception的筒子们,还是老老实实的try...catch处理!
2012-12-27 20:09 上传
下载附件
(40.53 KB)
一、测试连接memcached:
确保你memcached已经安装成功,如果没有,参考:
Redhat/CentOS使用yum报错的完美解决方案(顺带yum安装memcached)
http://f.dataguru.cn/forum.php?mod=viewthread&tid=44212&fromuid=4771
确保上图中的前四个jar包已经被引入,新建测试类TestConn2Mem.java,代码:
package com.oracle.biao.memcached;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.utils.AddrUtil;
public class TestConn2Mem {
public static void main(String[] args) throws Exception {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211"));
MemcachedClient memcachedClient = builder.build();
memcachedClient.set("hello", 0, "hello,memcached!");
String value = memcachedClient.get("hello");
System.out.println("hello=" + value);
memcachedClient.delete("hello");
System.out.println("hello has been deleted...");
value = memcachedClient.get("hello");
System.out.println("hello=" + value);
memcachedClient.shutdown();
}
}
复制代码
运行结果为:
WARN 20:17:07 (XMemcachedClient.java:674) - XMemcachedClient use Text protocol
INFO 20:17:08 (SelectorManager.java:37) - Creating 4 reactors...
WARN 20:17:08 (AbstractController.java:372) - The Controller started at localhost/127.0.0.1:0 ...
WARN 20:17:08 (MemcachedConnector.java:234) - Add a session: 127.0.0.1:11211
hello=hello,memcached!
hello has been deleted...
hello=null
WARN 20:17:08 (MemcachedConnector.java:348) - Remove a session: 127.0.0.1:11211
INFO 20:17:08 (AbstractController.java:478) - Controller has been stopped.
复制代码
如上所示,java连接memcached成功。
二、测试连mysql数据库:
确保mysql数据库已经安装,如果没有,参考:
Win7下MySQL解压缩版安装配置
http://f.dataguru.cn/forum.php?mod=viewthread&tid=34746&fromuid=4771
1、首先在数据库中建立相应的测试表以及构造些测试数据:
mysql> create table test_memcached(id int primary key auto_increment, value varchar(30) not null);
Query OK, 0 rows affected (0.14 sec)
复制代码
2、确保上图中的mysql-connector-java-*-bin.jar包已经被引入,新建测试类TestConn2MySQL.java,代码:
package com.oracle.biao.memcached;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestConn2MySQL {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.4:3306/test", "root", "root");
String sql = "select count(*) from test_memcached";
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(sql);
rs.next();
String rows = rs.getString(1);
System.out.println("Current rows is " + rows);
rs.close();
stat.close();
conn.close();
}
}
复制代码
运行结果为:
Current rows is 6
复制代码
如上所示,在mysql数据库中插入的6条数据被获得,连接mysql成功。
三、为性能对比测试准备数据:
确保前两步都已经试验成功,新建工具类DataGenerator.java,代码:
package com.oracle.biao.memcached;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.utils.AddrUtil;
public class DataGenerator {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.4:3306/test", "root", "root");
String sql = "select count(*) from test_memcached";
Statement stat = conn.createStatement();
stat.executeUpdate("truncate table test_memcached");
System.out.println("truncated table test_memcached......");
ResultSet rs = stat.executeQuery(sql);
for (int i = 100; i < 600; i++) {
stat.addBatch("insert into test_memcached(value) values('test" + i + "')");
}
int[] rows = stat.executeBatch();
System.out.println("inserted " + rows.length + " rows......");
rs.close();
stat.close();
conn.close();
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211"));
MemcachedClient memcachedClient = builder.build();
for (int i = 100; i < 600; i++) {
memcachedClient.delete(""+i);
}
System.out.println("purge memcached......");
for (int i = 100; i < 600; i++) {
memcachedClient.set(""+i, 0, "test"+i);
}
System.out.println("set 600 entries into memcached......");
memcachedClient.shutdown();
}
}
复制代码
运行完之后将会在mysql插入500条数据,并将相同的数据set进memcached中。运行后的控制台信息:
truncated table test_memcached......
inserted 500 rows......
WARN 20:37:19 (XMemcachedClient.java:674) - XMemcachedClient use Text protocol
INFO 20:37:19 (SelectorManager.java:37) - Creating 4 reactors...
WARN 20:37:19 (AbstractController.java:372) - The Controller started at localhost/127.0.0.1:0 ...
WARN 20:37:19 (MemcachedConnector.java:234) - Add a session: 127.0.0.1:11211
purge memcached......
set 600 entries into memcached......
复制代码
看到如上信息后,可以再用代码,或者直接查询,验证数据是否已正确构造。此处略,都懂的。。
四、比较从数据库中查询数据和从memcached中查询数据的性能:
确保前三步都已经试验成功,新建测试类TestPerformance.java,代码:
package com.oracle.biao.memcached;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import net.rubyeye.xmemcached.KeyIterator;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.utils.AddrUtil;
public class TestPerformance {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
long start1 = System.currentTimeMillis();
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.4:3306/test", "root", "root");
//long endConnMySQL = System.currentTimeMillis();
//System.out.println("Connect to mysql, Cost" + (endConnMySQL - start1) + "ms");
String sql = "select * from test_memcached";
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(sql);
while (rs.next()) {
String value = rs.getString(2);
}
long end1 = System.currentTimeMillis();
System.out.println("From mysql query 500 rows, Cost time:" + (end1 - start1) + "ms");
rs.close();
stat.close();
conn.close();
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211"));
MemcachedClient memcachedClient = builder.build();
long start2 = System.currentTimeMillis();
for (int i = 100; i < 600; i++) {
String value = memcachedClient.get(""+i);
}
long end2 = System.currentTimeMillis();
System.out.println("From memcached query 500 rows, Cost time:" + (end2 - start2) + "ms");
memcachedClient.shutdown();
}
}
复制代码
运行结果如下:
From mysql query 500 rows, Cost time:611ms
WARN 11:00:59 (XMemcachedClient.java:674) - XMemcachedClient use Text protocol
INFO 11:00:59 (SelectorManager.java:37) - Creating 4 reactors...
WARN 11:00:59 (AbstractController.java:372) - The Controller started at localhost/127.0.0.1:0 ...
WARN 11:00:59 (MemcachedConnector.java:234) - Add a session: 127.0.0.1:11211
From memcached query 500 rows, Cost time:307ms
WARN 11:00:59 (MemcachedConnector.java:348) - Remove a session: 127.0.0.1:11211
INFO 11:00:59 (AbstractController.java:478) - Controller has been stopped.
复制代码
From mysql query 500 rows, Cost time:611ms
From memcached query 500 rows, Cost time:307ms
从运行结果来看,对于此次测试,memcached性能上的优异还是挺明显的。。
但是,其实这么比较出来的结果的是不严谨的!依照例子而言,mysq的查询时间包括了连接的时间,如果不算连接的时间,结果是相反的:mysql的性能优于memcached好几倍!不信的筒子可以自己测试。
至此,本次试验完成!
相关文章推荐
- java连接memcached,并对比从数据库中查询数据与从memcached查询的性能
- java使用JDBC连接数据库,提高查询大量数据速度
- Java连接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash
- java JDBC 连接数据库查询数据与直接使用sql的疑问
- Java/jdbc连接数据库预处理只能查询一条数据?
- oracle 数据库的管理工具 PL/SQL_Developer 的简易使用 与Java 连接并查询显示出数据
- .NET ODBC与JAVA JDBC连接HIVE查询数据的性能比较
- java 创建连接oracle 数据库并查询数据
- JAVA数据库处理(连接,数据查询,结果集返回)
- java连接数据库对两张表进行查询对比的小项目
- JAVA对数据库进行操作,实现数据库中数据的插入,查询,更改,删除操作
- JAVA对数据库进行操作,实现数据库中数据的插入,查询,更改,删除操作
- 数据库连接测试及数据的查询
- Java:jdbc连接数据库插入中文数据乱码问题
- java实现连接mysql数据库单元测试查询数据的实例代码
- JDBC连接数据库:单线程、多线程、批处理插入数据的对比
- php连接数据库查询数据(方式二)
- 省市区数据库以及后台工程(Java)前端三级联动 后台数据查询
- MyBatis 【问题】解决java连接mysql查询含中文无数据的问题
- java连接数据库(SQL Server、MySQL、Oracle)及基本查询