通过算法小组给出的聚合文件,我们需要实现一种业务场景,通过用户的消费地点的商户ID与posId,查询出他所在的商圈,并通过商圈地点查询出与该区域的做活动的商户,并与之进行消息匹配,推送相应活动信息到用户手机。

那么整个流程分为两步,第一步,将整个聚合文件刷入缓存,文件数据格式如下:

  29 1:1 102100156910958 10015691 X有限公司 0 1
  29 1:1 102100156910958 10015691 X有限公司 0 1

  字段含义分别是 地区编号、商圈编号、商户编号、Pos编号、商户名称、合作商户标志。那么我们可以通过 商户编号+Post编号 来定位 其所在的商圈, 可以通过 地区编号+商圈编号 来获取该商圈的所有商户信息(Redis中直接set)。于是导入Redis是可使用key:商户编号+Post编号 value:地区编号+商圈编号 。 随之第二个key 为 地区编号+商圈编号 从而得到 该商圈的所有商户(Redis中使用hset)。

将聚合文件导入Redis,,部分代码如下

        String merchantId = StringUtils.join("V_",content[2].trim(),content[3].trim());
String areabiz = StringUtils.join(content[0].trim(),content[1].trim());
String merchantName = StringUtils.join(content[4].trim());
String flag = StringUtils.join(content[5].trim());
Map<String,String> MerchantMap = new HashMap<String,String>();
MerchantMap.put(merchantName, merchantId); try {
for (int i = 0; i < jedisvPools.size(); i++) {
JedisPool jp = jedisvPools.get(i);
Jedis jedis = null;
try {
jedis = jp.getResource();
//key为商户编号+PosId value为地区编号area+商圈编号bizAreaId
jedis.set(merchantId, areabiz);
//key为商圈编号+PosId value为商户名称,使用sadd添加相同商圈编号+PosId的商户
if("1".equals(flag)){
jedis.hmset(areabiz, MerchantMap);
}
} catch (Exception e) {
logger.error("", e);
} finally {
jedis.close();
}
}

将需要匹配的活动商户文件及信息导入redis,,部分代码如下

        if (StringUtils.isEmpty(content[4]) || StringUtils.isEmpty(content[5])
||StringUtils.isEmpty(content[6])) {
logger.warn("数据格式有误,内容为:{}", line);
return;
}
String merchantId = "";
String posIds = StringUtils.join(content[5]);
String address = StringUtils.join(content[3]);
String[] posIdArray = posIds.split("、");
String url = content[6];
Map<String,String> MerchantUrlAdress = new HashMap<String,String>();
MerchantUrlAdress.put(address,url);
for(String posId : posIdArray){
merchantId = StringUtils.join("Vir_",content[4].trim(),posId.trim());
try {
for (int i = 0; i < jedisPools.size(); i++) {
JedisPool jp = jedisPools.get(i);
Jedis jedis = null;
try {
jedis = jp.getResource();
//key为商户编号+PosId value为地区编号area+商圈编号bizAreaId
jedis.hmset(merchantId,MerchantUrlAdress);
} catch (Exception e) {
logger.error("", e);
} finally {
//jedis.close();
jp.returnResourceObject(jedis);
}
}

接入用户实时刷卡消费信息,流入storm,匹配该用户所在商圈的活动商户,并匹配获取该活动商户的地址及url信息 通过http的形式推送至支付宝或微信渠道,部分代码如下:

            String bizAreaName = "";
String bizAreaUrl = "";
String address = "";
//根据活动商户ID与postId 查询所在商圈
String areabiz = virtualBusinessService.getAreaBiz(MerchantId);
if(null == areabiz){
resultSets.addValue(ResultSets.OpType.INSERT,"BIZAREALISTNAME",bizAreaName);
resultSets.addValue(ResultSets.OpType.INSERT, "BIZAREAURL", bizAreaUrl);
resultSets.addValue(ResultSets.OpType.INSERT, "BIZADDRESS", address);
logger.info("VirtualTradeAreaAlgorithm="+MerchantId);
return resultSets;
}
//根据活动ID,获取该活动配置的商户Id
String activityMerchantCode = virtualBusinessService.getActivityConf(activityConfId);
//查询所在商圈的所有商户信息
Map<String,String> bizAreaNameMap = virtualBusinessService.getbizAreaNameSet(areabiz);
if(!bizAreaNameMap.isEmpty()){
//匹配活动配置的商户
for(String bizName : bizAreaNameMap.keySet()){
String mapvalue = bizAreaNameMap.get(bizName).replace("V_", "");
if(activityMerchantCode.contains(mapvalue)){
bizAreaName = bizName;
//根据活动商户名称查询该商户对应的商户ID
activityMerchantId = bizAreaNameMap.get(bizName).replace("V_","Vir_");
//根据活动商户Id,查询该活动商户的url Vir_89811144816144501080209
Map<String,String> bizAreaUrlAdree = virtualBusinessService.getBizUrl(activityMerchantId);
if(null == bizAreaUrlAdree){
address = "";
bizAreaUrl = "";
}else{
for(String bizAdress : bizAreaUrlAdree.keySet()){
address = bizAdress;
bizAreaUrl = bizAreaUrlAdree.get(bizAdress);
}
}
break;
}
}
}

具体还在整理,后续将其补全~

基于Redis、Storm的实时数据查询实践的更多相关文章

  1. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原

    一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数据可以 ...

  2. 基于MySQL Binlog的Elasticsearch数据同步实践

    一.为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数 ...

  3. redixdb 基于redis 协议的实时key-value 存储

    redixdb 是一个基于redis 协议搞的一个实时key value 处理的轻量级应用,支持多种后端 存储模型. 以下是一个小版的容器镜像(官方的太大了) dockerfile   FROM go ...

  4. Robinhood基于Apache Hudi的下一代数据湖实践

    1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...

  5. 基于redis的IP地址快速查询

    在一些大数据处理中,我们需要用到IP地址查询,一般为了查询一个IP属于哪个地址,我们通常需要根据一个IP数据库来查询,网络上比较常用的IP库是纯真IP数据库.IP数据库里面的记录一般存储方式为IP的开 ...

  6. Redis和Memchaed缓存数据查询

    使用TreeNMS数据库管理工具 支持Redis和Memchaed并存同时管理维护,支持集群管理,减少运维成本,提高工作效率 自带环境,免安装.免布署,下载解压即可使用.适用于windows,Linu ...

  7. 字节跳动流式数据集成基于Flink Checkpoint两阶段提交的实践和优化

    背景 字节跳动开发套件数据集成团队(DTS ,Data Transmission Service)在字节跳动内基于 Flink 实现了流批一体的数据集成服务.其中一个典型场景是 Kafka/ByteM ...

  8. 美团点评基于 Flink 的实时数仓建设实践

    https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...

  9. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

随机推荐

  1. Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

  2. 发一则自己创作的Lae程序员小漫画,仅供一乐

  3. hhvm之轻进程

    本文为原创,转载请注明:http://www.cnblogs.com/gistao/ 背景 我们在aws上部署了hhvm,高峰段发现cpu idle降的比较低,只有10-20%,而使用php-fpm的 ...

  4. HTML5新标签video在iOS上默认全屏播放

    今天做一个app时发现一个问题,应用html5中的video标签加载视频,在Android手机上默认播放大小,但是换成iPhone手机上出问题了,默认弹出全屏播放,查找了好多论坛,都没有谈论这个的.然 ...

  5. Tomcat调试笔记

    调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...

  6. CentOS6.5恢复误删除的文件

    系统环境:CentOS release 6.5 (Final) 内核版本:2.6.32-431.el6.x86_64 需要的源码包:extundelete-0.2.4.tar.bz2 解压bz2包: ...

  7. 使用SAXReader读取ftp服务器上的xml文件(原创)

    根据项目需求,需要监测ftp服务器上的文件变化情况,并将新添加的文件读入项目系统(不需要下载). spring配置定时任务就不多说了,需要注意的一点就是,现在的项目很多都是通过maven构建的,分好多 ...

  8. 【转载】javascript与C#的语法区别

    由于博主不允许的情况下不允许转载,我在这里只放上链接 http://blog.csdn.net/ranlianjie/article/details/2484139

  9. hdu1024 dp

    题意:求一个序列中的最大 m 段和,m 段不能交叉. dp[i][0/1][j] 表示已经取完第 i 个物品,第 i 个物品取或不取,取到第 j 个子段. 用vis[i][0/1][j] 表示该 dp ...

  10. jsp xml servlet

    什么都懂一点,什么都不精通!!