大数据电信项目之Redis缓存

目录

表设计介绍

为什么使用Redis

pom.xml配置文件

代码片段展示

1.从mysql中查询到Telid和dateid,先保存到map集合中

2.向redis中存储电话号码和电话号码的id(date和dateid一样)

整体代码


表设计介绍

在本项目的MapReduce分析阶段之后的自定义outputformat阶段,将分析后的数据写入到MySQL中。在该项目的表设计中,为了提高mysql的存储效率,解决宽表和高表问题,我们使用了三张表来存储项目数据,分别是ct-user、ct-date、ct-call

  • ct-user用于存储用户电话号码和ID以及用户姓名
  • ct-date用于存放通话日期以及ID
  • ct-call用于存放分析后的数据,该表有五个字段,分别是id、telid、dateid、sumcall(总通话次数)、sumduration(总通话时长)

为什么使用Redis

在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数据库。使得性能得到提升。

pom.xml配置文件

由于在该模块需要操作Redis以及从MySQL中查询数据和插入数据,所以需要在pom.xml文件中引入redis依赖和mysql的驱动!

        
            redis.clients
            jedis
            2.9.0
        
        
            mysql
            mysql-connector-java
            5.1.18
        

代码片段展示

1.从mysql中查询到Telid和dateid,先保存到map集合中

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);
            }

2.向redis中存储电话号码和电话号码的id(date和dateid一样)

       //向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);
        }
    }
}

 

你可能感兴趣的:(Hadoop云计算/大数据)