大数据电信项目之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的驱动!

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
        </dependency>

代码片段展示

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

public static void main(String[] args) {

        //读取mysql中的数据
        //将两张表缓存到内存中
        Map<String,Integer> userMap = new HashMap<>();
        Map<String,Integer> 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<String> 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<String,Integer> userMap = new HashMap<>();
        Map<String,Integer> 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<String> 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);
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值