java连接memcached,并对比从数据库中查询数据与从memcached查询的性能

60 篇文章 0 订阅

http://www.dataguru.cn/blog-4771-1052.html

说明:
系统为: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包下载请移步:

java连接memcached,并对比从数据库中查询数据与从memcached查询的性能
http://f.dataguru.cn/forum.php?mod=viewthread&tid=44395&fromuid=4771


试验准备:
如图:新建一个工程,导入五个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处理!


一、测试连接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> drop table test_memcached;

Query OK, 0 rows affected (0.05 sec)



mysql> create table test_memcached (id
varchar(5), value varchar(8));

Query OK, 0 rows affected (0.10 sec)



mysql> insert into test_memcached
values('id101','value101');

Query OK, 1 row affected (0.09 sec)



mysql> insert into test_memcached
values('id102','value102');

Query OK, 1 row affected (0.11 sec)



mysql> insert into test_memcached
values('id103','value103');

Query OK, 1 row affected (0.08 sec)



mysql> insert into test_memcached
values('id104','value104');

Query OK, 1 row affected (0.07 sec)



mysql> insert into test_memcached
values('id105','value105');

Query OK, 1 row affected (0.07 sec)



mysql> insert into test_memcached
values('id106','value106');

Query OK, 1 row affected (0.09 sec)



mysql> commit;

Query OK, 0 rows affected (0.00 sec)



mysql> select * from test_memcached;

+-------+----------+

| id   
| value    |

+-------+----------+

| id101 | value101 |

| id102 | value102 |

| id103 | value103 |

| id104 | value104 |

| id105 | value105 |

| id106 | value106 |

+-------+----------+

<span lang="EN-US" style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:
&quot;Calibri&quot;,&quot;sans-serif&quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:&quot;Times New Roman&quot;;mso-bidi-theme-font:minor-bidi;
mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA">6
rows in set (0.00 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 = 101; i <= 600; i++) {
                        stat.addBatch("insert into test_memcached values('id" + i + "', 'value" + 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 = 101; i <= 600; i++) {
                        memcachedClient.delete("id" + i);
                }
                System.out.println("purge memcached......");
                
                for (int i = 101; i <= 600; i++) {
                        memcachedClient.set("id" + i, 0, "value" + i);
                }
                System.out.println("set 500 entries into memcached......");
                memcachedClient.shutdown();
        }
}

运行完之后将会在mysql插入500条数据,并将相同的数据set进memcached中。运行后的控制台信息:
truncated table test_memcached......
inserted 500 rows......
WARN  18:44:03 (XMemcachedClient.java:674) - XMemcachedClient use Text protocol
INFO  18:44:03 (SelectorManager.java:37) - Creating 4 reactors...
WARN  18:44:03 (AbstractController.java:372) - The Controller started at localhost/127.0.0.1:0 ...
WARN  18:44:03 (MemcachedConnector.java:234) - Add a session: 127.0.0.1:11211
purge memcached......
set 500 entries into memcached......
INFO  18:44:04 (AbstractController.java:478) - Controller has been stopped.
WARN  18:44:04 (MemcachedConnector.java:348) - Remove a session: 127.0.0.1:11211


看到如上信息后,可以再用代码,或者直接查询,验证数据是否已正确构造。此处略,都懂的。。

四、比较从数据库中查询数据和从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");
                Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.4:3306/test", "root", "root");
                Statement stat = conn.createStatement();
                ResultSet rs = null;
                long start1 = System.currentTimeMillis();
                for (int i = 101; i <= 600; i++) {
                        String sql = "select * from test_memcached where id = 'id" + i + "'";
                        rs = stat.executeQuery(sql);
                        while (rs.next()) {
                                String id = rs.getString(1);
                                String value = rs.getString(2);
                                System.out.println("From mysql, id = " + id + ", value = " + value);
                        }
                }
                
                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 = 101; i <=600; i++) {
                        String value = memcachedClient.get("id" + i);
                        System.out.println("From memcached, id = id" + i + ", value = " + value);
                }
                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:731ms
WARN  18:46:50 (XMemcachedClient.java:674) - XMemcachedClient use Text protocol
INFO  18:46:50 (SelectorManager.java:37) - Creating 4 reactors...



From mysql query 500 rows, Cost time:731ms
From memcached query 500 rows, Cost time:416ms


从运行结果来看,对于此次测试,memcached性能上的优异还是挺明显的。。


至此,本次试验完成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值