功能简介
- 读取Redis数据
- 写入Mysql数据
遇到的问题
- Redis读取速度慢
- Mysql写入速度慢
- Mysql的update如果不成功,需要insert
解决的方法
- Redis 使用jedis,及jedis的pipeline方法,进行批处理
- Mysql 使用jdbc的批处理
代码示例
jedis pipeline 的使用
Jedis jedis=new Jedis("yourip",port);
//jedis.auth(password);//if redis have password
Pipeline p= jedis.pipelined();
//write by pipeline
for (...){
p.hmset(key,hashmap);
}
p.sync();//提交
//read by pipeline
ArrayList<Response<List<String>>> resps= new ArrayList<>();
for(...){
Response<List<String>> resp=p.hmget(key,field);
resps.add(resp);
}
p.sync();//提交
for(Response<List<String>>resp:resps){
resp.get();//获取数据
}
mysql update 不成功,则insert实现,其实很简单,只有调用方法,返回结果,结果为0,则未成功,就表示要执行insert操作。因为第一次接触,所以也走了些弯路,当初看过存储过程,但是要在mysql预处理,在mysql上创建存储过程,也不是很方便。
String sql="update your_table set key1=?,key2=? where key3=? and key4=?;"
try (PreparedStatement preStmt = conn.prepareStatement(sql.toString())) {
conn.setAutoCommit(false); // 设置手动提交
for (int i=0;i<data.size();i++) {
List<String> values=data.get(i);
for (int j = 0; j < valueIndexs.length; j++) {
preStmt.setString(j + 1, values.get(valueIndexs[j]));
}
preStmt.addBatch();
}
System.out.println("批量update导入数据库....");
long start = System.currentTimeMillis();
//0-fail,1-success
int[] results=preStmt.executeBatch();// 获取update的结果,如果返回为0,则需要insert;
// preStmt.clearBatch();
conn.commit(); // 提交
long end = System.currentTimeMillis();
System.out.println("批量update导入数据库时间: " + (end - start) + "ms");