您的位置:首页 > 数据库 > Redis

Redis查询&JDBC查询&Hibernate查询方式的效率比较...

2016-08-31 19:37 357 查看
比较三种查询方式查询效率对比...我是用的JavaWeb的方式通过通过JSP页面查询的填写查询的参数...给予反馈....

整个demo的下载地址:http://files.cnblogs.com/files/DreamDrive/redis2sql.rar

1.后台对应的表结构:



创建表的SQL语句:

CREATE TABLE `asset` (
`assetid` int(100) NOT NULL AUTO_INCREMENT,
`assetname` varchar(100) DEFAULT NULL,
`region` varchar(50) DEFAULT NULL,
`programtype` varchar(50) DEFAULT NULL,
`releasetime` varchar(100) DEFAULT NULL,
`director` varchar(50) DEFAULT NULL,
`actor` varchar(500) DEFAULT NULL,
`screenwriter` varchar(50) DEFAULT NULL,
`language` varchar(50) DEFAULT NULL,
`duration` varchar(50) DEFAULT NULL,
`alias` varchar(255) DEFAULT NULL,
PRIMARY KEY (`assetid`)
) ENGINE=InnoDB AUTO_INCREMENT=579430 DEFAULT CHARSET=utf8


搞了一个简易的JSP页面用来传参:



附主要代码:

主servlet接受参数,调用各种不同的查询方式:

RedisSqlSearchServlet.java

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
* 测试Redis和JDBC查询效率
* @author CDV-DX7
*
*/
public class RedisSqlSearchServlet extends HttpServlet {
private String redisSearchResult;
private String jdbcSerachResult;
private String hibernateSerachResult;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.接收参数
*/
request.setCharacterEncoding("UTF-8");
// 1.接收参数
Map<String,String[]> searchParaMap = request.getParameterMap();
String[] searchtypeArr = searchParaMap.get("searchtype");
String[] assetnameArr = searchParaMap.get("assetname");
String[] directorArr = searchParaMap.get("director");
String[] screenwriterArr = searchParaMap.get("screenwriter");
String[] actorArr = searchParaMap.get("actor");
String[] programtypeArr = searchParaMap.get("programtype");
String[] regionArr = searchParaMap.get("region");
String[] languageArr = searchParaMap.get("language");

String searchtype = "";
String assetname = "";
String director = "";
String screenwriter = "";
String actor = "";
String programtype = "";
String region = "";
String language = "";

if (searchtypeArr!= null){
searchtype = searchtypeArr[0];
}
if (assetnameArr!= null){
assetname = assetnameArr[0];
}
if (directorArr!= null){
director = directorArr[0];
}
if (screenwriterArr!= null){
screenwriter = screenwriterArr[0];
}
if (actorArr!= null){
actor = actorArr[0];
}
if (programtypeArr!= null){
programtype = programtypeArr[0];
}
if (regionArr!= null){
region = regionArr[0];
}
if (languageArr!= null){
language = languageArr[0];
}

HttpSession session = request.getSession();
if("Redis查询".equals(searchtype)){
redisSearchResult = JedisSearchUtil.redisSearch(assetname, director, actor, screenwriter, region, language, programtype);
session.setAttribute("searchResult", redisSearchResult);

}else if("JDBC查询Mysql".equals(searchtype)){
jdbcSerachResult = JdbcSqlSearchUtil.jdbcSerach(assetname, director, actor, screenwriter, region, language, programtype);
session.setAttribute("searchResult", jdbcSerachResult);
}else if("Hibernate查询Mysql".equals(searchtype)){
hibernateSerachResult = HibernateSearchUtil.hibernateSerach(assetname, director, actor, screenwriter, region, language, programtype);
session.setAttribute("searchResult", hibernateSerachResult);
}
response.sendRedirect(request.getContextPath()+"/searchResult.jsp");
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}


Redis查询:

JedisSearchUtil.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Jedis;

public class JedisSearchUtil {

public static String redisSearch(String assetname,String director,String actor,
String screenwriter,String region,String language,String programtype){
Jedis jedis = RedisUtil.getJedis();
//0------50万

//1------100万
jedis.select(1);

//2------500万

//3------1000万

try{
String assetnameKey = "";
String screenwriterKey = "";
String actorKey = "";
String programtypeKey = "";
String regionKey = "";
String languageKey = "";
String directorKey = "";

List<String> keysList =  new ArrayList<String>();
if(assetname != null && assetname != ""){
assetnameKey = "asset:assetname:"+ assetname;
keysList.add(assetnameKey);
}
if(screenwriter != null && screenwriter != ""){
screenwriterKey = "asset:screenwriter:"+ screenwriter;
keysList.add(screenwriterKey);
}
if(actor != null && actor != ""){
actorKey = "asset:actor:"+ actor;
keysList.add(actorKey);
}
if(programtype != null && programtype != ""){
programtypeKey = "asset:programtype:"+ programtype;
keysList.add(programtypeKey);
}
if(region != null && region != ""){
regionKey = "asset:region:"+ region;
keysList.add(regionKey);
}
if(language != null && language != ""){
languageKey = "asset:language:"+ language;
keysList.add(languageKey);
}
if(director != null && director != ""){
directorKey = "asset:director:"+ director;
keysList.add(directorKey);
}

long start = System.currentTimeMillis();

int keysListSize = keysList.size();
String [] convertKeysArr = (String[])keysList.toArray(new String[keysListSize]);

Set<String> sinterIds = jedis.sinter(convertKeysArr);
long findIdsEnd = System.currentTimeMillis();

Map<String, String> asset = new HashMap<String, String>();

//            String actor = "";
//            String director = "";
//            String screenwriter = "";
//            String region = "";
//            String programtype = "";
//            String alias = "";

long loopbegin = System.currentTimeMillis();
for (String assetid : sinterIds) {
//                long start1 = System.currentTimeMillis();
asset = jedis.hgetAll("asset:"+assetid);
//                long start11 = System.currentTimeMillis();
//System.out.println("Redis中取到hash值用时"+(start11-start1));

asset.get("actor");
asset.get("director");
asset.get("screenwriter");
asset.get("region");
asset.get("programtype");
asset.get("language");
//alias = asset.get("alias");
//System.out.println("主演:"+actor+",导演:"+director+",编剧:"+screenwriter+",地区:"+region+",节目类型:"+programtype+",别名"+alias);
}

long loopend = System.currentTimeMillis();
//Reids中共有"+Long.valueOf(jedis.dbSize())+"条键值对;"+"\n

String redisSearchResult = "Redis找到符合条件的id集合用时:"+(findIdsEnd-start)+
"毫秒;\nRedis再遍历符合条件id集合使用时间:"+(loopend-loopbegin)+"毫秒;\nRedis总共花费时间:"+(loopend-start)+
"毫秒;\nRedis共查询出"+sinterIds.size()+"个记录;";
return redisSearchResult;
}finally{
RedisUtil.returnRedis(jedis);
}
}
}


JDBC查询方式:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* JDBC查询Mysql数据库并返回查询结果(查询花费的时间,查询到多少条数)
* @author CDV-DX7
*
*/
public class JdbcSqlSearchUtil {

public static void main(String[] args) {
System.out.println(jdbcSerach("","冯小刚","葛优","顾晓阳","中国大陆","汉语普通话","喜剧"));
}

public static String jdbcSerach(String assetname,String director,String actor,
String screenwriter,String region,String language,String programtype){
Connection connection = null;
PreparedStatement preparedStatement = null;
//static Statement statement2 = null;//用来统计数据库中的总记录数
ResultSet resultSet = null;
try {
long start = System.currentTimeMillis();
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");

//通过驱动管理类获取数据库链接

//50万数据对应的连接
//connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8", "root", "root");

//100万数据对应的连接
connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/1million?characterEncoding=utf-8", "root", "root");

//查询数据库中的总记录数
String allRecordSql = "select count(*) from asset";

Map<String,Integer> countMap = new HashMap<String,Integer>();
//定义sql语句 ?表示占位符
StringBuilder sql = new StringBuilder();
sql.append("select * from asset where ");
if(assetname != null && assetname != ""){
sql.append(" assetname like ?");
countMap.put(assetname,countMap.size()+1);
}
if(director != null && director != ""){
if(countMap.size() < 1){
sql.append(" director like ?");
}else{
sql.append(" and director like ?");
}
countMap.put(director,countMap.size()+1);
}
if(programtype != null && programtype != ""){
if(countMap.size() < 1){
sql.append(" programtype like ?");
}else{
sql.append(" and programtype like ?");
}
countMap.put(programtype,countMap.size()+1);
}
if(actor != null && actor != ""){
if(countMap.size() < 1){
sql.append(" actor like ?");
}else{
sql.append(" and actor like ?");
}
countMap.put(actor,countMap.size()+1);
}
if(screenwriter != null && screenwriter != ""){
if(countMap.size() < 1){
sql.append(" screenwriter like ?");
}else{
sql.append(" and screenwriter like ?");
}

countMap.put(screenwriter,countMap.size()+1);
}
if(region != null && region != ""){
if(countMap.size() < 1){
sql.append(" region like ?");
}else{
sql.append(" and region like ?");
}
countMap.put(region,countMap.size()+1);
}
if(language != null && language != ""){
if(countMap.size() < 1){
sql.append(" language like ?");
}else{
sql.append(" and language like ?");
}
countMap.put(language,countMap.size()+1);
}

//            StringBuilder sql = "select * from asset where assetname like ? and director like ? and programtype like ? " +
//                    "and actor like ? and screenwriter like ? and region like ? and language like ? ";

//获取预处理statement
preparedStatement = connection.prepareStatement(sql.toString());

//statement2 = connection.createStatement();
//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
if(assetname != null && assetname != ""){
preparedStatement.setString(countMap.get(assetname), "%"+assetname+"%");
//preparedStatement.setString(countMap.get(assetname), assetname);
}
if(director != null && director != ""){
preparedStatement.setString(countMap.get(director), "%"+director+"%");
//preparedStatement.setString(countMap.get(director),director);
}
if(programtype != null && programtype != ""){
preparedStatement.setString(countMap.get(programtype), "%"+programtype+"%");
//preparedStatement.setString(countMap.get(programtype), programtype);
}
if(actor != null && actor != ""){
preparedStatement.setString(countMap.get(actor), "%"+actor+"%");
//preparedStatement.setString(countMap.get(actor), actor);
}
if(screenwriter != null && screenwriter != ""){
preparedStatement.setString(countMap.get(screenwriter), "%"+screenwriter+"%");
//preparedStatement.setString(countMap.get(screenwriter), screenwriter);
}
if(region != null && region != ""){
preparedStatement.setString(countMap.get(region), "%"+region+"%");
//preparedStatement.setString(countMap.get(region), region);
}
if(language != null && language != ""){
preparedStatement.setString(countMap.get(language), "%"+language+"%");
//preparedStatement.setString(countMap.get(language), language);
}

long searchend = System.currentTimeMillis();

//向数据库发出sql执行查询,查询出结果集
resultSet =  preparedStatement.executeQuery();
//resultSet2 =  statement2.executeQuery(allRecordSql);
//遍历查询结果集
long loopstart = System.currentTimeMillis();
int i=0;
while(resultSet.next()){
i++;
resultSet.getString("director");
resultSet.getString("actor");
resultSet.getString("programtype");
resultSet.getString("screenwriter");
resultSet.getString("region");
resultSet.getString("language");
//System.out.println(resultSet.getString("director")+"  "+resultSet.getString("actor")+"  "+resultSet.getString("programtype")+"  "+resultSet.getString("screenwriter")
//    +"  "+resultSet.getString("region")+"  "+resultSet.getString("language")+"  "+resultSet.getString("alias"));
}
long loopend = System.currentTimeMillis();

String searchResult = "JDBC找到这些数据用时:"+ (searchend-start)+"毫秒;\nJDBC对结果循环遍历耗时时:"+(loopend-loopstart)
+"毫秒;\nJDBC共耗时:"+(loopend-start)+"毫秒;\nJDBC共查找到"+i+"个记录";
return searchResult;
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return "-----";
}
}


其余代码省略........

最需要总结的是Reids中的参数不确定下的查询集合交集的方式和JDBC查询条件下查询参数不确定的查询方式...

List<String> keysList =  new ArrayList<String>();//用一个List来接收前台参来的查询参数
keysList.add(screenwriterKey);
..........................
int keysListSize = keysList.size();//得到共有多查询参数
String [] convertKeysArr = (String[])keysList.toArray(new String[keysListSize]); //这个List变成指定大小的数组
Set<String> sinterIds = jedis.sinter(convertKeysArr);//sinter(...)求多个集合的交集,可以接收动态参数...动态参数本质上是数组.


sinter中传入的可以是一个动态的参数.....动态的参数本质上是数组.

关于动态数组的总结博客:

其次是JDBC动态接受参数个数的方式:

原本查询语句是select * from asset where assetname like ? and director like ? and programtype like ? and actor like ? screenwriter like ? and region like ? ........
但是查询条件不固定....不一定有对应的对应的查询项

Map<String,Integer> countMap = new HashMap<String,Integer>();//因为预处理参数需要记录值和对应值在sql语句中的位置
//这里使用Map的方式,值是key,sql中的第几个数字作为value
//定义sql语句 ?表示占位符
StringBuilder sql = new StringBuilder();
sql.append("select * from asset where ");
if(assetname != null && assetname != ""){
sql.append(" assetname like ?");
countMap.put(assetname,countMap.size()+1);
}
if(director != null && director != ""){
if(countMap.size() < 1){
sql.append(" director like ?");
}else{
sql.append(" and director like ?");
}
countMap.put(director,countMap.size()+1);
}
if(programtype != null && programtype != ""){
if(countMap.size() < 1){
sql.append(" programtype like ?");
}else{
sql.append(" and programtype like ?");
}
countMap.put(programtype,countMap.size()+1);
}
.......................................
//设置参数preparedStatement,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
if(assetname != null && assetname != ""){
preparedStatement.setString(countMap.get(assetname), "%"+assetname+"%");
}
if(director != null && director != ""){
preparedStatement.setString(countMap.get(director), "%"+director+"%");
//preparedStatement.setString(countMap.get(director),director);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: