目录
表设计介绍
为什么使用Redis
pom.xml配置文件
代码片段展示
1.从mysql中查询到Telid和dateid,先保存到map集合中
2.向redis中存储电话号码和电话号码的id(date和dateid一样)
整体代码
在本项目的MapReduce分析阶段之后的自定义outputformat阶段,将分析后的数据写入到MySQL中。在该项目的表设计中,为了提高mysql的存储效率,解决宽表和高表问题,我们使用了三张表来存储项目数据,分别是ct-user、ct-date、ct-call
在MapReduce阶段分析完成后,将分析的结果插入到MySQL数据库中,id为自增长,telid为用户表ct-user中的电话号码对应的id,而不是电话号码,dateid对应的是日期表ct-date表中通话日期对应的id,而不是通话日期。这就需要通过reduce方法处理后输出的key和value(key中包含了电话号码tel和通话时间date)来从mysql的ct-user表和ct-date表中取得对应的id号,然后插入到ct-call表中。考虑到每一次向MySQL插入数据都要从MySQL中查询一次telid和dateid,这样效率很低。因此考虑到使用Redis缓存来解决这个问题,将MySQL中的电话号码tel和id以及日期date和dateid先查询出来缓存到Redis中,这样每一次向MySQL中插入分析后的数据时直接从Redis缓存中取数据,而不用去查询MySQL数据库。使得性能得到提升。
由于在该模块需要操作Redis以及从MySQL中查询数据和插入数据,所以需要在pom.xml文件中引入redis依赖和mysql的驱动!
redis.clients
jedis
2.9.0
mysql
mysql-connector-java
5.1.18
public static void main(String[] args) {
//读取mysql中的数据
//将两张表缓存到内存中
Map userMap = new HashMap<>();
Map dateMap = new HashMap<>();
Connection connection = null;
PreparedStatement pstat = null;
ResultSet rs = null;
try {
connection = JDBCUtil.getConnection();
String queryUserSql = "select id,tel from ct_user";
pstat = connection.prepareStatement(queryUserSql);
rs = pstat.executeQuery();
while (rs.next()){
Integer id = rs.getInt(1);
String tel = rs.getString(2);
//将用户的Tel和id从数据库中取出,保存到map中,相当于加载到缓存中,方便后面做id映射
userMap.put(tel,id);
}
rs.close();
//查询时间
String queryDateSql = "select id,year,month,day from ct_date";
pstat = connection.prepareStatement(queryDateSql);
rs = pstat.executeQuery();
while (rs.next()){
Integer id = rs.getInt(1);
String year = rs.getString(2);
String month = rs.getString(3);
//保证月份是两位数
if(month.length() == 1){
month = "0" + month;
}
String day = rs.getString(4);
if(day.length() == 1){
day = "0" + day;
}
//将用户的Tel和id从数据库中取出,保存到map中,相当于加载到缓存中,方便后面做id映射
dateMap.put(year + month + day,id);
}
//向redis中存储telid数据
Jedis jedis = new Jedis("cMaster",6379);
Iterator keyIterator = userMap.keySet().iterator();
while (keyIterator.hasNext()){
String key = keyIterator.next();
Integer value = userMap.get(key); //通过电话号码取得id然后存放在redis中
jedis.hset("ct_user",key,"" + value);
}
package com.wp.ct.cache;
import com.wp.ct.common.util.JDBCUtil;
import redis.clients.jedis.Jedis;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 使用redis做缓存:将MySQL中的数据查询出来,然后缓存到redis中
* 启动缓存客户端,向redis中增加缓存数据
*/
public class Bootstrap {
public static void main(String[] args) {
//读取mysql中的数据
//将两张表缓存到内存中
Map userMap = new HashMap<>();
Map dateMap = new HashMap<>();
Connection connection = null;
PreparedStatement pstat = null;
ResultSet rs = null;
try {
connection = JDBCUtil.getConnection();
String queryUserSql = "select id,tel from ct_user";
pstat = connection.prepareStatement(queryUserSql);
rs = pstat.executeQuery();
while (rs.next()){
Integer id = rs.getInt(1);
String tel = rs.getString(2);
//将用户的Tel和id从数据库中取出,保存到map中,相当于加载到缓存中,方便后面做id映射
userMap.put(tel,id);
}
rs.close();
//查询时间
String queryDateSql = "select id,year,month,day from ct_date";
pstat = connection.prepareStatement(queryDateSql);
rs = pstat.executeQuery();
while (rs.next()){
Integer id = rs.getInt(1);
String year = rs.getString(2);
String month = rs.getString(3);
//保证月份是两位数
if(month.length() == 1){
month = "0" + month;
}
String day = rs.getString(4);
if(day.length() == 1){
day = "0" + day;
}
//将用户的Tel和id从数据库中取出,保存到map中,相当于加载到缓存中,方便后面做id映射
dateMap.put(year + month + day,id);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstat != null){
try {
pstat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//向redis中存储telid数据
Jedis jedis = new Jedis("cMaster",6379);
Iterator keyIterator = userMap.keySet().iterator();
while (keyIterator.hasNext()){
String key = keyIterator.next();
Integer value = userMap.get(key); //通过电话号码取得id然后存放在redis中
jedis.hset("ct_user",key,"" + value);
}
//将时间和id缓存到redis中
keyIterator = dateMap.keySet().iterator();
while (keyIterator.hasNext()){
String key = keyIterator.next();
Integer value = dateMap.get(key); //通过电话号码取得id然后存放在redis中
jedis.hset("ct_date",key,"" + value);
}
}
}